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

本文关键字:服务 服务处 消息 处理 何同步 同步 数据库 存储 | 更新日期: 2023-09-27 18:30:05

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

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

我定义了一个基本的消息表如下:

  1. MessageId int
  2. CreateTimeStamp日期时间
  3. 交付时间戳日期时间
  4. 有效负载varchar(最大值)
  5. 到期日期时间
  6. RetryCount int
  7. CorrelationId int
  8. 状态int(1-等待,2-处理,3-发送,4-重试,5-失败)
  9. *ProcessIdLock int-这是进程正在处理消息的消息传递服务的id

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

我在想这样一个方案:

  1. 执行记录锁定:更新消息SET ProcessIdLock=MessageProcessorId,SET状态=2--正在处理WHERE消息ID输入(从消息中选择前10个消息IDWHERE过期<GETTIME()+创建时间戳AND状态=1--等待OR状态=3--重试)

    以上步骤将由单个用户处理多达10条消息一次服务

  2. 获取锁定的记录:SELECT Payload FROM Messages WHERE状态=2--正在处理AND ProcessIdLock=MessageProcessorId

  3. 更新已处理的每条消息的状态:Update Messages
    SET状态=(通过、失败或重试),SET DeliveredTimeStamp=GETDATE()--仅传递WHERE MessageId=ProcessedMessageId

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

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

一个客户端可能会重新连接(并且应该会收到消息),而另一个客户端则可能不会重新连接(因此消息将在消息过期后删除)。

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

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

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

我同意David Nelson的观点。除非你有充分的理由这样做,否则我会考虑现有的解决方案。除了NServiceBus,您还可以签出MassTransit。