事件驱动分布式系统中redis的网络异常处理

3pvhb19x  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(335)

我已经实现了一个restfulapi,在一些端点上进行一些更新时,我需要连接到rabbitmq服务器或redis服务器。这些信息将有助于事件的进一步发展。我的问题是,如何处理这种情况下的网络异常?
例如,如果任务a被更新,我首先在db中更新任务的状态(例如mongodb),然后在某个rabbitmq服务器上提交一条消息,通知另一个微服务上的另一个使用者。或者我可能需要更新redis服务器上的一些计数器。


* API REQUEST - update Task A
* serving request:
* update Task A on DB
* send message to RabbitMQ about the change (ERROR ? socket timeout. do I retry indef ?)
* update a counter on Redis (ERROR ? socket timeout - do I retry indef?)

如果在尝试连接rabbitmq或redis时出现“套接字超时异常”,该如何处理?我应该尝试还原数据库上的更改并简单地返回HTTP500吗?或者我应该试着写下一些文件或数据库,关于这个失败,以便以后可以再试一次?
系统是事件驱动的。没有守护进程一直在检查来自db的任务,所以在收到api请求的那一刻,必须将上述消息发送到rabbitmq。或者redis服务器上的更新应该是在收到api请求时进行的

2ic8powd

2ic8powd1#

这在很大程度上取决于你在做什么,你在处理什么。
网络可靠吗?服务可靠吗?如果重播/重试某个内容会有大问题吗?如果有任务悬而未决,这是个大问题吗?如何处理不一致的状态?
您提到了发布到rabbitmq时的超时(我假设使用confirms),但是如果rabbitmq确认消息丢失了会发生什么呢?或者证实了这一点,并且在流程中还有其他错误?
最后,架构将由您的风险模型决定,考虑哪些风险是可接受的,哪些是不可接受的。
通常的方法是尝试创建幂等流并在失败时重试(因此多次更新并不重要),但不一定是这样。
如果您绝对需要系统在每个时间点保持一致,那么您可能需要实现一个包含所有部分的分布式事务算法。

相关问题