我有一些关于处理无法响应成功的消息的问题,但成功提交到数据库。
我认为设计的保证处理信息一次。
以下顺序是处理步骤
问题包含在★
1)从消息队列中获取消息
- >在此之后失败时,MQ将超时&重试
2)Cache.SetIfNotExist(MessageId,MyId,Timeout)
ProcessingTime< Cache.Timeout< MQ.Timeout
*这使得消息的所有权
- >在此之后失败时,Cache将超时并且MQ将超时&重试
3)处理数据包括读取存储
*所有数据应包括乐观锁定信息
- >在此之后失败时,Cache将超时并且MQ将超时&重试
4)Cache.Get(MessageId)== MyId
*这确认此处理器拥有消息的所有权
- >在此之后失败时,Cache将超时并且MQ将超时&重试
5)提交数据
*这会将所有数据提交到存储中
*如果更新多个文档,乐观锁定不保证一致性(如果存在全部或全部功能,则可以获得一致性保证)
*如果您使用某些文档进行乐观锁定状态的读取,则应通过乐观锁定检查读取文档和提交文档
*您应该使用RDBMS中的事务来保证一致性
★这是问题后失败。如果MQ重试此事务,则无法检查。因此,交易将被处理两次或更多次
★如果在提交数据期间缓存超时,则会出现同样的问题。
6)Cache.Set(MessageId,MyId,Timeout)
*在删除消息之前,防止MQ超时重试。
7)确认消息
*发送完成并从消息队列中删除消息
感谢您的阅读。
答案 0 :(得分:0)
如果数据库没有保留有问题的消息所有者数据,我发现没有办法解决这个问题。
在数据库中,恢复机制恢复在停机后删除已提交但未结束的崩溃数据
解决这种情况的一种方法是在提交阶段失败时向所有权缓存检查数据库添加阶段标志
其他方式是更新数据库知道发布的消息ID到期,并用定期批处理删除它
只有一个线程写入作业可以保证一致性,或者需要其他机制。所以对DB通信的服务有两个线程,它无法保证。