1

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

MOM(面向消息的中间件)需要将消息存储在单个数据库中,但可能由多个服务处理以实现可伸缩性和故障转移。

我已经定义了一个基本的 Messages 表,如下所示:

  1. MessageId int
  2. CreateTimeStamp 日期时间
  3. DeliveredTimeStamp 日期时间
  4. 有效载荷 varchar(max)
  5. 到期日期时间
  6. 重试次数 int
  7. CorrelationId int
  8. 状态 int(1-等待,2-处理,3-发送,4-重试,5-失败)
  9. *ProcessIdLock int - 这是正在处理消息的消息传递服务的进程 ID

问题是,撇开身份问题不谈,我如何确保一个服务一次处理每条消息?

我正在考虑这样的方案:

  1. 执行记录锁定: UPDATE Messages SET ProcessIdLock = MessageProcessorId, SET State = 2 -- Processing WHERE MessageId IN ( SELECT TOP 10 MessageId FROM Messages WHERE Expiration < GETTIME() + CreateTimeStamp AND St​​ate = 1 -- Waiting OR State = 3 -- 重试)

    上述步骤将获得最多 10 条消息一次由单个服务处理

  2. 获取锁定记录: SELECT Payload FROM Messages WHERE State = 2 -- Processing AND ProcessIdLock = MessageProcessorId

  3. 更新处理的每条消息的状态:UPDATE Messages
    SET State = (Pass, Fail, or Retry), SET DeliveredTimeStamp = GETDATE() -- Pass only WHERE MessageId = ProcessedMessageId

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

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

一个客户端可能会重新连接(并且应该获取消息),而另一个客户端可能不会重新连接(因此消息将在消息过期后被丢弃)。

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

4

2 回答 2

2

我知道它不能直接回答你的问题,但我强烈建议你不要在这里重新发明轮子。创建一个可靠、持久、可扩展的消息传递系统不是您应该轻易采取的措施。相反,我鼓励您研究现有的开源实现,例如NServiceBus

于 2012-04-04T17:46:21.627 回答
0

我同意大卫尼尔森的观点。除非您有充分的理由这样做,否则我会考虑现有的解决方案。除了 NServiceBus 您还可以结帐MassTransit

于 2012-04-04T22:51:52.617 回答