Jad*_*son 7 c# nservicebus publish-subscribe
我正在开发一个系统来支持从各种硬件类型接收状态信息.每个硬件都报告相同的状态信息(纬度,经度),但每种硬件类型都使用唯一的协议来报告此信息.出于这个原因,我有多个服务,每个设备类型一个,监听和解析该设备的协议.我希望每个服务都使用一条公共消息发布状态信息:
public interface IPositionMessage : IMessage
{
string UnitName { get; set; }
double Latitude { get; set; }
double Longitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我没有设置我的第一个服务,但现在我正在设置我的第二个服务,我发现我的订阅者无法订阅来自多个发布者的相同消息.
在NServiceBus yahoo组的类似问题中,推荐的解决方案是将公共消息转换为命令并使用Bus.Send而不是Bus.Publish.我觉得在这种情况下没有意义,因为真正发生的事情是一个事件(该单位已经到达一个位置并报告新的位置).如果我要将此转换为命令,我需要提前知道此事件的所有潜在订阅者,我不这样做.另一种可能的解决方案是创建一个聚合/重新发布者,每个服务将Bus.Send,然后该消息将从单个发布者重新发布.这似乎是一个不必要的瓶颈.
是否有任何方法允许订阅者订阅来自多个发布者的相同消息?
Dav*_*ike 12
这是Udi试图让你很难逃脱的那些SOA"成功之坑"之一.
基本的二元性是这样的:
但是这个权威来源是LOGICAL的权威来源.重要的是,如果我对所有IPositionMessage数据感兴趣,那么我应该只有一个逻辑点(queuename @ servername)发送我的订阅请求.
这并不意味着同一逻辑服务中的多个物理处理器不能都发布相同的事件类型,只要它们发布的内容是权威的.
关键是所有物理处理器必须共享相同的订阅存储.实际上,您可能希望只有一个物理端点处理订阅请求,而根本不处理任何处理.它只接收订阅请求(QueueX @ ServerY对IPositionMessage感兴趣)并更新订阅存储.
然后,绑定到相同订阅存储的每个处理器将发布IPositionMessage,并发现QueueX @ ServerY感兴趣,并将该事件的副本发送到该位置.
在运行NServiceBus.Lite配置文件的开发环境中,这将有点难以吞下,因为默认情况下订阅存储在内存中,所以很明显它不会被共享并且似乎无法正常运行,所以请准备好为了那个原因.