如何同步存储在数据库中但由多个服务处理的消息
本文关键字:服务 服务处 消息 处理 何同步 同步 数据库 存储 | 更新日期: 2023-09-27 18:30:05
我想知道如何创建自己的SOA风格的消息传递系统,类似于JMS(Java消息传递系统)。
MOM(面向消息传递的中间件)需要将消息存储在单个数据库中,但可能由多个服务处理,以实现可扩展性和故障切换。
我定义了一个基本的消息表如下:
- MessageId int
- CreateTimeStamp日期时间
- 交付时间戳日期时间
- 有效负载varchar(最大值)
- 到期日期时间
- RetryCount int
- CorrelationId int
- 状态int(1-等待,2-处理,3-发送,4-重试,5-失败)
- *ProcessIdLock int-这是进程正在处理消息的消息传递服务的id
问题是,撇开幂等性问题不谈,我如何确保一个服务一次处理每个消息?
我在想这样一个方案:
-
执行记录锁定:更新消息SET ProcessIdLock=MessageProcessorId,SET状态=2--正在处理WHERE消息ID输入(从消息中选择前10个消息IDWHERE过期<GETTIME()+创建时间戳AND状态=1--等待OR状态=3--重试)
以上步骤将由单个用户处理多达10条消息一次服务
-
获取锁定的记录:SELECT Payload FROM Messages WHERE状态=2--正在处理AND ProcessIdLock=MessageProcessorId
-
更新已处理的每条消息的状态:Update Messages
SET状态=(通过、失败或重试),SET DeliveredTimeStamp=GETDATE()--仅传递WHERE MessageId=ProcessedMessageId
注意:我遇到的另一个问题是,一些消息被广播到按id分组的几个客户端(因此,可能总共有100个客户端,但每个客户端组将由10个或更少的客户端组成)。
例如,如果一个组中有5个客户端,但当前有2个客户端断开连接,会发生什么情况?我想在这些客户回来的时候把这个信息发给他们。
一个客户端可能会重新连接(并且应该会收到消息),而另一个客户端则可能不会重新连接(因此消息将在消息过期后删除)。
感谢您阅读本文。对我来说,这似乎是一个典型的企业问题。MSMQ是最好的解决方案吗?我是MSMQ的新手,MSMQ消息是保留在存储器中还是保留在内存中?
我知道它不能直接回答你的问题,但我强烈鼓励你不要在这里重新发明轮子。创建一个可靠、持久、可扩展的消息传递系统是不应该掉以轻心的。相反,我鼓励您研究现有的开源实现,例如NServiceBus。
我同意David Nelson的观点。除非你有充分的理由这样做,否则我会考虑现有的解决方案。除了NServiceBus,您还可以签出MassTransit。