我想知道如何创建自己的 SOA 风格的消息传递系统,类似于 JMS(Java 消息传递系统)。
MOM(面向消息的中间件)需要将消息存储在单个数据库中,但可能由多个服务处理以实现可伸缩性和故障转移。
我已经定义了一个基本的 Messages 表,如下所示:
- MessageId int
- CreateTimeStamp 日期时间
- DeliveredTimeStamp 日期时间
- 有效载荷 varchar(max)
- 到期日期时间
- 重试次数 int
- CorrelationId int
- 状态 int(1-等待,2-处理,3-发送,4-重试,5-失败)
- *ProcessIdLock int - 这是正在处理消息的消息传递服务的进程 ID
问题是,撇开身份问题不谈,我如何确保一个服务一次处理每条消息?
我正在考虑这样的方案:
执行记录锁定: UPDATE Messages SET ProcessIdLock = MessageProcessorId, SET State = 2 -- Processing WHERE MessageId IN ( SELECT TOP 10 MessageId FROM Messages WHERE Expiration < GETTIME() + CreateTimeStamp AND State = 1 -- Waiting OR State = 3 -- 重试)
上述步骤将获得最多 10 条消息一次由单个服务处理
获取锁定记录: SELECT Payload FROM Messages WHERE State = 2 -- Processing AND ProcessIdLock = MessageProcessorId
更新处理的每条消息的状态:UPDATE Messages
SET State = (Pass, Fail, or Retry), SET DeliveredTimeStamp = GETDATE() -- Pass only WHERE MessageId = ProcessedMessageId
注意:我遇到的另一个问题是,一些消息被广播到按 id 分组的多个客户端(这样,总共可能有 100 个客户端,但每个客户端组将包含 10 个或更少)。
例如,如果一个组中有 5 个客户端,但当前有 2 个客户端断开连接,会发生什么情况?我想在这些客户回来时将该消息发送给他们。
一个客户端可能会重新连接(并且应该获取消息),而另一个客户端可能不会重新连接(因此消息将在消息过期后被丢弃)。
谢谢您阅读此篇。对我来说,这似乎是一个典型的企业问题。MSMQ 会是最好的解决方案吗?我是 MSMQ 的新手,MSMQ 消息是保存在存储中还是保存在内存中?