I don't understand the issue.. instead of bus.Publish(events) why not
foreach (@event in events) bus.Publish(@event) ?

On Aug 5, 8:57 am, Udi Dahan <thesoftwaresimpl...@udidahan.com> wrote:
> Should an implementation detail of your command side cause such issues at
> the interface level?
>
> I would think not - in which case, maybe the implementation needs to be
> re-evaluated. Don't assume what the structure of your aggregates is supposed
> to be, nor the events they expose. Let it evolve from the needs of the
> interface.
>
> Regards,
>
> -- Udi Dahan
>
> From: rhino-tools-dev@googlegroups.com
> [mailto:rhino-tools-...@googlegroups.com] On Behalf Of Mike Nichols
> Sent: Thursday, August 05, 2010 6:38 PM
> To: rhino-tools-dev@googlegroups.com
> Subject: Re: [rhino-tools-dev] Re: rhino rsb subscription harvesting
>
> @Jason, Thanks for jumping in :)
> I am not using Udi's implementation of DomainEvents.Raise<TEvent>(..). I am
> familiar with that approach, but am instead doing event sourcing. What this
> means is during the course of an operation one or more events are applied to
> the Aggregate Root. Upon the commit of a UnitOfWork those events are
> serialized to an event store after which they are published on a bus. Not
> all usages of Domain Events are synchronous operations on the query store.
> They can be but I have pulled those out of process.
> In a separate process lives a series of Denormalizers which subscribe to
> these events. But the domain itself may also subscribe to these events for
> purpose of communicating across Bounded Contexts or perhaps contributing to
> a saga.
> My posting didn't have to do with any of this, though :).
>
> Instead, it was related to the faulty assumption that calling Publish on
> more than one message should assume that every endpoint in that batch of
> messages can be derived from the first message in the batch. That works for
> Send, but not Publish. When I am calling Send, I am safely making
> assumptions about the endpoint to which I am Sending those
> messages...namely, that they will go to the same place. When I call Publish,
> that assumption should not be made.
>
> On Thu, Aug 5, 2010 at 7:31 AM, Jason Meckley <jasonmeck...@gmail.com>
> wrote:
>
> Mike, if I'm following the discussion correctly the problem has become
> confusion between messages on RSB and handlers for domain events.
>
> messaging (RSB) is an asynchronous action. you can batch messages
> together and all the messages in the batch are send to the endpoint
> defined by the 1st message in the batch. that is by design to keep
> transactional boundaries. if you need to send multiple messages to
> various endpoints you need to send them separately, each it's own
> transaction.
>
> domain events are synchronous operations that would occur within the
> same transaction as the message(s) being processed. for example here
> is a consumer to process an order
> void Consume(ProcessOrder message)
> {
>   session.Get<Order>(message.OrderNumber).Process();
>
> }
>
> the Process() method on order might look like this
> void Process()
> {
>   //validate order is ready for processing
>   //change the state of order and/or order lines
>
>   DomainEvents.Raise<OrderProcessed>(this);
>
> }
>
> where DomainEvents.Raise is a static facade to instantiate and execute
> the various OrderProcessed. for example you may have the following
> handlers for order processing
> SendInvoiceToCustomer : IHandler<OrderProcessed>
> ShipProductsToCustomer : IHandler<OrderProcessed>
> DecreaseInventoryOfItemsOnTheOrder : IHandler<OrderProcessed>
> UpdateATableUsedForReporting : IHandler<OrderProcessed>
>
> all of these handlers would execute immediately, within the same
> transaction, when the order is processed. and if any of these
> operations would fail the entire transaction would rollback as well.
> Some of these handlers may call the service bus to send another
> message but each of those messages is yet another transaction
> independent of actually processing the order.
>
> I hope this helps rather than adds confusion or another tangent. From
> what I have read, understanding this distinction may help explain why
> RSB works the way it does, where domain events fit into the
> architecture and how the 2 are used to solve different problems. And
> why atomic transactions to various endpoints doesn't work (or is a bad
> idea).
>
> On Aug 5, 9:03 am, Mike Nichols <nichols.mik...@gmail.com> wrote:
>
> > @Udi
> > I am not sure I understand. I am using event sourcing, so I persist events
> > on the domain side for rehydration of Aggregates, etc (domain-side). The
> bus
> > publishes these events, which are subscribed to by interested query-side
> > denormalizers.
>
> > On Thu, Aug 5, 2010 at 12:40 AM, Udi Dahan
>
> <thesoftwaresimpl...@udidahan.com
>
>
>
>
>
>
>
> > > wrote:
> > > I think that the reason you're running into difficulty is that your
> > > persisting data on the command side that should have only been persisted
> on
> > > the query side.
>
> > > Cheers,
>
> > > -- Udi Dahan
>
> > > -----Original Message-----
> > > From: rhino-tools-dev@googlegroups.com
> > > [mailto:rhino-tools-...@googlegroups.com] On Behalf Of Mike Nichols
> > > Sent: Thursday, August 05, 2010 1:09 AM
> > > To: Rhino Tools Dev
> > > Subject: [rhino-tools-dev] Re: rhino rsb subscription harvesting
>
> > > @Udi
> > > I am persisting the events. After the events have been persisted they
> > > are put on the bus for publication.
> > > My initial concern here though was about the assumption that the first
> > > message in a batch is the sole provider of subscription details for an
> > > entire batch of messages. It seems like a user should just Publish a
> > > batch of messages on a bus and not be concerned about who is
> > > subscribed to them.
>
> > > To be clear this code from the PublishInternal method in the
> > > defaultservicebus is what I am discussing.What this code is saying is
> > > that if you have two messages in a batch being Published, and each one
> > > is subscribed to by different endpoints, then the second message in
> > > the batch will not get published. That seems unpredictable to me:
> > > private bool PublishInternal(object[] messages)
> > >        {
> > >            if (messages == null)
> > >                throw new ArgumentNullException("messages");
>
> > >            bool sentMsg = false;
> > >            if (messages.Length == 0)
> > >                throw new MessagePublicationException("Cannot publish
> > > an empty message batch");
> > >            object msg = messages[0];
> > >            IEnumerable<Uri> subscriptions =
> > > subscriptionStorage.GetSubscriptionsFor(msg.GetType());
> > >            foreach (Uri subscription in subscriptions)
> > >            {
>
> > > transport.Send(endpointRouter.GetRoutedEndpoint(subscription),
> > > messages);
> > >                sentMsg = true;
> > >            }
> > >            return sentMsg;
> > >        }
>
> > > m
>
> > > On Aug 4, 9:51 am, Udi Dahan <thesoftwaresimpl...@udidahan.com> wrote:
> > > > Mike,
>
> > > > The case of CQRS usually has the service layer publishing the events
> in
> > > > response to commands, domain events has nothing to do with it. If
> you're
> > > > talking about event-based persistence on the command-side, again,
> domain
> > > > events have nothing to do with the bus.
>
> > > > Cheers,
>
> > > > -- Udi Dahan
>
> > > > -----Original Message-----
> > > > From: rhino-tools-dev@googlegroups.com
>
> > > > [mailto:rhino-tools-...@googlegroups.com] On Behalf Of Mike Nichols
> > > > Sent: Wednesday, August 04, 2010 4:46 PM
> > > > To: Rhino Tools Dev
> > > > Subject: [rhino-tools-dev] Re: rhino rsb subscription harvesting
>
> > > > If I have 5 events that took place on my aggregate root during the
> > > > course of a unit of work. My understanding is that the root represents
> > > > a transactional boundary. So I publish the events on the bus as a
> > > > batch. The subscriber (in this case, denormalizers for events that
> > > > write to a database) will go through each event and update the
> > > > database, ideally in a single transaction so that if one of the
> > > > handlers fails, then they all fail.
> > > > As I think about it, I am not sure why that is so important other than
> > > > the convenience of having NHib in a single session and cut down on the
> > > > number of roundtrips. But I realize this is an impl detail that
> > > > shouldn't be the driver.
>
> > > > @Udi - I actually went back and forth on whether to publish these
> > > > individually or not, so it is helpful to hear from you on this. Can
> > > > you see why I would consider the batch a single unit though? If you
> > > > are using a denormalizer you always only send one event at a time to
> > > > that endpoint?
>
> > > > On Aug 4, 6:35 am, Udi Dahan <thesoftwaresimpl...@udidahan.com> wrote:
> > > > > Then I'm afraid it sounds like you're not using DomainEvents the
> right
> > > way
> > > > -
> > > > > each event from the domain should be a discrete domain occurrence.
>
> > > > > -- Udi Dahan
>
> > > > > -----Original Message-----
> > > > > From: rhino-tools-dev@googlegroups.com
>
> > > > > [mailto:rhino-tools-...@googlegroups.com] On Behalf Of Mike Nichols
> > > > > Sent: Wednesday, August 04, 2010 3:45 PM
> > > > > To: Rhino Tools Dev
> > > > > Subject: [rhino-tools-dev] Re: rhino rsb subscription harvesting
>
> > > > > I am publishing the DomainEvents from my domain. These events are
> > > > > subscribed to by 1 (or more report) services that update the db
> state
> > > > > from those events.
> > > > > @Udi - I could publish them one at a time, yes, but I'd rather the
> > > > > whole batch fail since they represent a unit of work from my
> > > > > domain...I don't want some messages to succeed and others to fail
> > > > > leaving the db in an odd state.
>
> > > > > On Aug 4, 5:39 am, Ayende Rahien <aye...@ayende.com> wrote:
> > > > > > What is the scenario in which you would want to publish a message
> > > batch?
> > > > > > And publishing doesn't use the owners, it uses the subscriptions
> > > list.
> > > > > > I think that I had the wrong idea in mind about what we are
> talking
> > > > about,
> > > > > > yes, for publish, that would make sense, but I still want to know
> > > what
> > > > > your
> > > > > > scenario is.
>
> > > > > > On Wed, Aug 4, 2010 at 3:33 PM, Mike Nichols
> > > > > <nichols.mik...@gmail.com>wrote:
>
> > > > > > > Isn't that the difference between Publish and Send though?
> > > > > > > 'Publishing' an event in my mind doesn't carry any assumption
>
> about ...
>
> read more »

-- 
You received this message because you are subscribed to the Google Groups 
"Rhino Tools Dev" group.
To post to this group, send email to rhino-tools-...@googlegroups.com.
To unsubscribe from this group, send email to 
rhino-tools-dev+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rhino-tools-dev?hl=en.

Reply via email to