2017-03-05 107 views
0

我对处理无法响应成功的消息有所疑问,但成功提交到数据库。
如何处理无法响应成功但成功提交到数据库的消息

我认为的设计是为了保证处理信息一次。
以下序列是处理步骤。
问题被包括在从消息有★

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)如果提交数据期间缓存超时,则会出现同样的问题。

感谢您的阅读。

回答

0

我发现没有办法来解决这个问题,如果数据库没有保留消息ownernip数据的问题描述。
在数据库中,恢复机制在停机后恢复移除崩溃的数据(如已提交但未终止的数据库)。
解决这种情况的一种方法是,在提交阶段失败时,向所有权缓存校验数据库添加阶段标志。
其他方式是更新数据库知道已发布messageid到期并删除与定期批处理。
只有一个线程写入作业可以保证一致性,或者需要其他机制。所以对数据库通信的服务有两个线程,它不能保证。

相关问题