【问题标题】:Handling network exceptions in an event driven distributed system在事件驱动的分布式系统中处理网络异常
【发布时间】:2020-08-28 01:57:35
【问题描述】:

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

例如,如果 Task A 更新了,我首先更新 DB(例如 mongodb)中 Task 的状态,然后在某个 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 时遇到“套接字超时异常”,我该如何处理?我应该尝试还原数据库上的更改并简单地返回 HTTP 500 吗? 或者我应该尝试写下一些文件或数据库,关于这个失败,以便以后可以再次尝试?

系统是事件驱动的。没有守护进程不断检查来自 DB 的任务,因此必须在收到 API 请求的那一刻将这条消息发送到 RabbitMQ。或者 Redis 服务器上的更新应该是在收到 API 请求的那一刻进行的

【问题讨论】:

    标签: exception redis rabbitmq distributed-computing


    【解决方案1】:

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

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

    您在发布到 RabbitMQ 时提到了超时(我假设带有确认),但是如果 RabbitMQ 确认消息丢失会发生什么?或者确认它并且流程中还有其他错误?

    最终,架构将由您的风险模型确定,考虑哪些风险可以接受,哪些不可以。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多