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



我已经实现了一个RESTful API,在一些端点上的一些更新中,我需要连接到一些RabbitMQ服务器或Redis服务器。这些信息将有助于事件的进一步展开。我的问题是,如何处理这种情况下的网络异常?

例如,如果任务A被更新,我首先更新数据库中任务的状态(例如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请求时进行

这在很大程度上取决于你想做什么以及你在处理什么。

网络可靠吗?服务可靠吗?如果某个内容被重播/重试,这是一个大问题吗?如果某项任务悬而未决,这是个大问题吗?如何处理不一致的状态?

您提到在发布到RabbitMQ时会出现超时(我假设使用confirms(,但如果RabbitMQ确认消息丢失,会发生什么?或者确认了它,然后还有其他错误?

最后,架构将由您的风险模型决定,考虑哪些风险是可接受的,哪些风险是不可接受的。

通常的方法是尝试创建幂等流,并在它们失败时重试(因此多次更新无关紧要(,但事实并非如此。

如果您绝对需要系统在每个时间点都是一致的,那么您可能需要实现一个涉及所有部分的分布式事务算法。

最新更新