On 09/06/14 19:31 +0000, Kurt Griffiths wrote:
Folks, this may be a bit of a bombshell, but I think we have been dancing
around the issue for a while now and we need to address it head on. Let me
start with some background.

Back when we started designing the Marconi API, we knew that we wanted to
support several messaging patterns. We could do that using a unified queue
resource, combining both task distribution and feed semantics. Or we could
create disjoint resources in the API, or even create two separate services
altogether, one each for the two semantic groups.

The decision was made to go with a unified API for these reasons:

 • It would afford hybrid patterns, such as auditing or diagnosing a task
   distribution queue
 • Once you implement guaranteed delivery for a message feed over HTTP,
   implementing task distribution is a relatively straightforward addition. If
   you want both types of semantics, you don’t necessarily gain anything by
   implementing them separately.

Lately we have been talking about writing drivers for traditional message
brokers that will not be able to support the message feeds part of the API.
I’ve started to think that having a huge part of the API that may or may not
“work”, depending on how Marconi is deployed, is not a good story for users,
esp. in light of the push to make different clouds more interoperable.
Therefore, I think we have a very big decision to make here as a team and a
community. I see three options right now. I’ve listed several—but by no means
conclusive—pros and cons for each, as well as some counterpoints, based on past
discussions.

Option A. Allow drivers to only implement part of the API

For:

 • Allows for a wider variety of backends. (counter: may create subtle
   differences in behavior between deployments)
 • May provide opportunities for tuning deployments for specific workloads
* Simplifies client implementation and API

Against:

 • Makes it hard for users to create applications that work across multiple
   clouds, since critical functionality may or may not be available in a given
   deployment. (counter: how many users need cross-cloud compatibility? Can
   they degrade gracefully?)

This is definitely unfortunate but I believe it's a fair trade-off. I
believe the same happens in other services that have support for
different drivers.

We said we'd come up with a set of features that we considered core
for Marconi and that based on that we'd evaluate everything. Victoria
has been doing a great job with identifying what endpoints can/cannot
be supported by AMQP brokers. I believe this is a key thing to have
before we make any decision here.


Option B. Split the service in two. Different APIs, different services. One
would be message feeds, while the other would be something akin to Amazon’s
SQS.

For:

 • Same as Option A, plus creates a clean line of functionality for deployment
   (deploy one service or the other, or both, with clear expectations of what
   messaging patterns are supported in any case).

Against:

 • Removes support for hybrid messaging patterns (counter: how useful are such
   patterns in the first place?)
 • Operators now have two services to deploy and support, rather than just one
   (counter: can scale them independently, perhaps leading to gains in
   efficiency)


Strong -1 for having 2 separate services. IMHO, this would just
complicate things from a admin / user perspective.


Option C. Require every backend to support the entirety of the API as it now
stands.
For:

 • Least disruptive in terms of the current API design and implementation
 • Affords a wider variety of messaging patterns (counter: YAGNI?)
 • Reuses code in drivers and API between feed and task distribution
   operations (counter: there may be ways to continue sharing some code if the
   API is split)

Against:

 • Requires operators to deploy a NoSQL cluster (counter: many operators are
   comfortable with NoSQL today)
 • Currently requires MongoDB, which is AGPL (counter: a Redis driver is under
   development)
 • A unified API is hard to tune for performance (counter: Redis driver should
   be able to handle high-throughput use cases, TBD)


A and C are both reasonable solutions. I personally prefer A with a
set of optional features well defined. In addition to that, we have
discussed having features discoverability that will allow users to
know features are supported. This makes developing applications on top
of Marconi a bit harder, though.

That said, I believe what needs to be done is re-think some of the
existing endpoints in order to embrace existing technologies /
protocols. With the addition of flavors, we'll have the same issue.
For instance, a user with 2 queues on different storage drivers - 1 on
mongodb and 1 on say rabbitmq - will likely have to develop based on
the features exposed by the driver with less supported features -
unless the application is segmented. In other words, the user won't be
able to dynamically create queue instances and re-use the same code.

Our API, as-is, is quite dependant on a store-forward message delivery
model and on a database-like storage. I don't think this is entirely
wrong but I do believe it could be simplified in order to support
other drivers without splitting it.

I’d love to get everyone’s thoughts on these options; let's brainstorm for a
bit, then we can home in on the option that makes the most sense. We may need
to do some POCs or experiments to get enough information to make a good
decision.


I think Victoria's work - AMQP 1.0 driver - is important for this
decision. Lets work with her on what she's achieved and what won't be
supported. We should come back here with that sub set of features
considered core.

Flavio


--
@flaper87
Flavio Percoco

Attachment: pgp71RUP6R5vZ.pgp
Description: PGP signature

_______________________________________________
OpenStack-dev mailing list
OpenStack-dev@lists.openstack.org
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to