[openstack-dev] [Zaqar] Zaqar and SQS Properties of Distributed Queues
Flavio Percoco
flavio at redhat.com
Fri Sep 19 08:00:57 UTC 2014
On 09/18/2014 07:19 PM, Joe Gordon wrote:
>
>
> On Thu, Sep 18, 2014 at 7:45 AM, Flavio Percoco <flavio at redhat.com
> <mailto:flavio at redhat.com>> wrote:
>
> On 09/18/2014 04:09 PM, Gordon Sim wrote:
> > On 09/18/2014 12:31 PM, Flavio Percoco wrote:
> >> On 09/17/2014 10:36 PM, Joe Gordon wrote:
> >>> My understanding of Zaqar is that it's like SQS. SQS uses distributed
> >>> queues, which have a few unusual properties [0]:
> >>>
> >>>
> >>> Message Order
> >>>
> >>> Amazon SQS makes a best effort to preserve order in messages, but due to
> >>> the distributed nature of the queue, we cannot guarantee you will
> >>> receive messages in the exact order you sent them. If your system
> >>> requires that order be preserved, we recommend you place sequencing
> >>> information in each message so you can reorder the messages upon
> >>> receipt.
> >>>
> >>
> >> Zaqar guarantees FIFO. To be more precise, it does that relying on the
> >> storage backend ability to do so as well. Depending on the storage used,
> >> guaranteeing FIFO may have some performance penalties.
> >
> > Would it be accurate to say that at present Zaqar does not use
> > distributed queues, but holds all queue data in a storage mechanism of
> > some form which may internally distribute that data among servers but
> > provides Zaqar with a consistent data model of some form?
>
> I think this is accurate. The queue's distribution depends on the
> storage ability to do so and deployers will be able to choose what
> storage works best for them based on this as well. I'm not sure how
> useful this separation is from a user perspective but I do see the
> relevance when it comes to implementation details and deployments.
>
>
> > [...]
> >> As of now, Zaqar fully relies on the storage replication/clustering
> >> capabilities to provide data consistency, availability and fault
> >> tolerance.
> >
> > Is the replication synchronous or asynchronous with respect to client
> > calls? E.g. will the response to a post of messages be returned only
> > once the replication of those messages is confirmed? Likewise when
> > deleting a message, is the response only returned when replicas of the
> > message are deleted?
>
> It depends on the driver implementation and/or storage configuration.
> For example, in the mongodb driver, we use the default write concern
> called "acknowledged". This means that as soon as the message gets to
> the master node (note it's not written on disk yet nor replicated) zaqar
> will receive a confirmation and then send the response back to the
> client. This is also configurable by the deployer by changing the
> default write concern in the mongodb uri using
> `?w=SOME_WRITE_CONCERN`[0].
>
>
> This means that by default Zaqar cannot guarantee a message will be
> delivered at all. A message can be acknowledged and then the 'master
> node' crashes and the message is lost. Zaqar's ability to guarantee
> delivery is limited by the reliability of a single node, while something
> like swift can only loose a piece of data if 3 machines crash at the
> same time.
Correct, as mentioned in my reply to Gordon, I also think `majority` is
a saner default for the write concern in this case.
I'm glad you mentioned Swift. We discussed a while back about having a
storage driver for it. I thought we had a blueprint for that but we
don't. Last time we discussed it, swift seemed to cover everything we
needed, IIRC. Anyway, just a thought.
Flavio
> [0] http://docs.mongodb.org/manual/reference/connection-string/#uri.w
>
> >
> >> However, as far as consuming messages is concerned, it can
> >> guarantee once-and-only-once and/or at-least-once delivery depending on
> >> the message pattern used to consume messages. Using pop or claims
> >> guarantees the former whereas streaming messages out of Zaqar guarantees
> >> the later.
> >
> > From what I can see, pop provides unreliable delivery (i.e. its similar
> > to no-ack). If the delete call using pop fails while sending back the
> > response, the messages are removed but didn't get to the client.
>
> Correct, pop works like no-ack. If you want to have pop+ack, it is
> possible to claim just 1 message and then delete it.
>
> >
> > What do you mean by 'streaming messages'?
>
> I'm sorry, that went out wrong. I had the "browsability" term in my head
> and went with something even worse. By streaming messages I meant
> polling messages without claiming them. In other words, at-least-once is
> guaranteed by default, whereas once-and-only-once is guaranteed just if
> claims are used.
>
> >
> > [...]
> >> Based on our short conversation on IRC last night, I understand you're
> >> concerned that FIFO may result in performance issues. That's a valid
> >> concern and I think the right answer is that it depends on the storage.
> >> If the storage has a built-in FIFO guarantee then there's nothing Zaqar
> >> needs to do there. In the other hand, if the storage does not have a
> >> built-in support for FIFO, Zaqar will cover it in the driver
> >> implementation. In the mongodb driver, each message has a marker that is
> >> used to guarantee FIFO.
> >
> > That marker is a sequence number of some kind that is used to provide
> > ordering to queries? Is it generated by the database itself?
>
> It's a sequence number to provide ordering to queries, correct.
> Depending on the driver, it may be generated by Zaqar or the database.
> In mongodb's case it's generated by Zaqar[0].
>
> [0]
> https://github.com/openstack/zaqar/blob/master/zaqar/queues/storage/mongodb/queues.py#L103-L185
>
> --
> @flaper87
> Flavio Percoco
>
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> <mailto:OpenStack-dev at lists.openstack.org>
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>
--
@flaper87
Flavio Percoco
More information about the OpenStack-dev
mailing list