views:

530

answers:

1

Hi all,

I have a service which needs to run on multiple machines picking jobs off of a single queue ensuring each job is only undertaken by a single service. I also need to publish messages for all services to receive, such as reload triggers.

Is this possible in nservicebus without too much hacking?

I have proved that both the publish model and send model work for me but as soon as my client needs to deal with both architectures, it treats them all as a send architecture and not all services receive the publish methods.

Here are the config files I have so far:

Publisher (all services need to receive these messages), uses Bus.Publish<...>(...):

  <MsmqTransportConfig InputQueue="ConfigQueue" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />

  <UnicastBusConfig DistributorControlAddress="" DistributorDataAddress="" ForwardReceivedMessagesTo="">
<!-- Message publishers don't require message queues -->
<MessageEndpointMappings />  </UnicastBusConfig>

Sender (only one service can pick these up), uses Bus.Send<...>(...):

  <MsmqTransportConfig InputQueue="BrokerQueue" ErrorQueue="error" numberOfWorkerThreads="1" MaxRetries="5" />

  <UnicastBusConfig DistributorControlAddress="" DistributorDataAddress="" ForwardReceivedMessagesTo="">
<MessageEndpointMappings>
  <add Messages="EventMessage, Messages" Endpoint="AgentQueue" />
</MessageEndpointMappings>  </UnicastBusConfig>

Services (each have the same local queue name and subscribe to the publisher above):

  <MsmqTransportConfig InputQueue="AgentQueue" ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />

  <UnicastBusConfig>
<MessageEndpointMappings>
  <add Messages="NServiceBus.Messages.ReloadMessage, NServiceBus.Messages" Endpoint="ConfigQueue" />
</MessageEndpointMappings>  </UnicastBusConfig>
+1  A: 

Load balancing between different machines is accomplished with the Distributor that comes with NServiceBus. (remote transactional reads are flaky on MSMQ and is not recommended)

So all you sends would go to the same input queue, BrokerQueue in you case. You would then configure the distributor to feed of that queue.

More info on how to configure the distributor can be found here:

http://tech.groups.yahoo.com/group/nservicebus/message/2009

Hope this helps!

Andreas
Thanks for that, I have the distributor working as outlined in that post, but still can't get the workers to subscribe to a message broadcast for all workers. Publishing instead of sending to the distributordata queue results in a single worker picking up the messsage as does trying the pub/sub architecture at the same time as the distributor architecture.
theGecko