C# 如何同步存储在数据库中但由多个服务处理的消息

C# 如何同步存储在数据库中但由多个服务处理的消息,c#,soa,messaging,C#,Soa,Messaging,我想知道如何创建自己的SOA风格的消息传递系统,类似于JMS Java消息传递系统 面向MOM消息传递的中间件需要将消息存储在单个数据库中,但可能由多个服务处理,以实现可扩展性和故障切换 我定义了一个基本消息表,如下所示: MessageId int 创建时间戳日期时间 交付时间戳日期时间 有效载荷varcharmax 过期日期时间 RetryCount int 相关ID int 状态int 1-等待,2-处理,3-发送,4-重试,5-失败 *ProcessIdLock int-这是一个进程 正

我想知道如何创建自己的SOA风格的消息传递系统,类似于JMS Java消息传递系统

面向MOM消息传递的中间件需要将消息存储在单个数据库中,但可能由多个服务处理,以实现可扩展性和故障切换

我定义了一个基本消息表,如下所示:

MessageId int 创建时间戳日期时间 交付时间戳日期时间 有效载荷varcharmax 过期日期时间 RetryCount int 相关ID int 状态int 1-等待,2-处理,3-发送,4-重试,5-失败 *ProcessIdLock int-这是一个进程 正在处理消息的消息服务的id 问题是,撇开idempence问题不谈,如何确保一个服务一次处理每条消息

我在考虑这样一个计划:

执行记录锁定:更新消息集ProcessIdLock= MessageProcessorId,设置状态=2-处理,其中 中的MessageId 从消息中选择前10个消息ID 其中Expiration 上述步骤最多可由一个用户处理10条消息 一次服务

获取锁定的记录:从消息中选择有效负载,其中 State=2-Processing和ProcessIdLock=MessageProcessorId

更新每个已处理邮件的状态:更新邮件 设置状态=通过、失败或重试,设置DeliveredTimeStamp= GETDATE-仅当MessageId=ProcessedMessageId时传递

注意:我遇到的另一个问题是,一些消息被广播到按id分组的多个客户端,这样,总共可能有100个客户端,但每个客户端组将由10个或更少的客户端组成

例如,如果一个组中有5个客户端,但有2个客户端当前已断开连接,会发生什么情况?我想在这些客户回来时向他们发送这个消息

一个客户端可能会重新连接并应获得消息,而另一个客户端可能不会重新连接,因此消息过期后将丢弃消息


谢谢你阅读这篇文章。对我来说,这似乎是一个典型的企业问题。MSMQ是最好的解决方案吗?我是MSMQ新手,MSMQ消息是保存在存储器中还是保存在内存中?

我知道它不能直接回答您的问题,但我强烈建议您不要在这里重新发明轮子。创建一个可靠、持久、可扩展的消息传递系统并非易事。例如,我鼓励您研究现有的开源实现。

我同意David Nelson的观点。除非你有很好的理由这么做,否则我会看看现有的解决方案。除了NServiceBus,您还可以结帐。

也许我对NServiceBus和其他服务(包括MSMQ)还不够了解,但我需要一个允许多个服务处理给定消息的系统。当所有连接的和侦听的服务都处理完该消息后,可以从数据库中删除该消息。我所做的是创建消息、服务和ServiceMessages表。然后我用左外接。。。其中ServiceMessages为NULL以检查处理情况。一旦消息被读取和处理,我会在ServiceMessages表中添加一个条目,表明它已被处理。