我对处理无法响应成功的消息有所疑问,但成功提交到数据库。
如何处理无法响应成功但成功提交到数据库的消息
我认为的设计是为了保证处理信息一次。
以下序列是处理步骤。
问题被包括在从消息有★
1)FETCH消息语句队列
- >当在此之后失败,MQ将超时&重试
2)Cache.SetIfNotExist(的MessageId,MYID,超时)
ProcessingTime < Cache.Timeout < MQ.Timeout
*的消息
这使所有权 - >当在此之后失败,缓存会超时,MQ会超时&的重试
3)处理数据包括读取存储
*所有数据的应包括乐观锁信息
- >当在此之后失败,高速缓存将超时和MQ将超时&重试
4) Cache.Get(的MessageId)==身份识别码
*这证实了这一处理器拥有所有权消息
- >当在此之后失败,缓存会超时,MQ将超时&重试
5)提交数据
*这将所有数据提交到存储
*如果您更新多个文档,乐观锁不保证一致性(如果全有或全无的特征是存在的,你可以得到一致性保证)
*如果您使用某些文档进行乐观锁定状态阅读,则阅读文档和提交文档应通过乐观锁定进行检查
*您应该在RDBMS中使用事务以保证一致性
★这是问题后失败。如果MQ重试此事务,则无法检查。所以transcation将被处理两次或更多。
★如果提交数据期间缓存超时,则会发生同样的问题。
6)Cache.Set(MessageId,MyId,Timeout)
*在删除消息前防止MQ超时重试。
7)确认消息
*发送到结束,从消息队列中删除消息
- 问题:如何处理这个问题?
1)提交数据出现问题后失败。如果MQ重试此事务,则无法检查。所以transcation将被处理两次或更多。
2)如果提交数据期间缓存超时,则会出现同样的问题。
感谢您的阅读。