【问题标题】:Store and forward design pattern with multiple instances of a microservice具有多个微服务实例的存储和转发设计模式
【发布时间】:2019-11-05 22:26:08
【问题描述】:

我正在设计一个接收请求的服务,该请求只能执行一次(由于存在唯一的 ID,可以多次接收)。

流程是:

外面的世界 -> HTTP -> [Myservice的一组实例] -> HTTP -> 供应商服务

所以,我通过 HTTP 接收到一堆请求,我希望进行一些转换、检查、将请求存储在数据库中并通过 HTTP 发送到供应商服务。

我的问题是:

什么是在我的服务中实现存储转发模式的有效方法,即接收请求并立即存储它,因此立即将其发送到“外部世界”,然后在我自己的时间将其转发到目标服务,根据需要重试多次?


问题:

  • 如果 myservice 的其中一个实例在向供应商服务发送请求时出现故障怎么办?
  • 如果有一堆请求未转发,我将如何监控?
  • 如何避免另一个编排服务?
  • 如何避免另一个单实例服务有效地监视数据库并转发任何尚未转发的请求。
  • 如何最小化外部依赖 - 例如我知道这里的某种队列可能有助于解决这个问题,但我想看看我是否可以避免这种情况。

【问题讨论】:

  • 你可能会发现使用消息代理之类的东西有一些好处,它允许你持久化消息并在处理器确认时删除它们(我认为 kafka 给了你)
  • 是的,你是对的!我试图弄清楚是否有一种方法可以在没有其他依赖项的情况下做到这一点,即消息代理 - kafka、mq 等。
  • 您有矛盾的要求。您想要只有经过数年才能构建的成熟中间件才能提供的功能,但您希望它们不费吹灰之力就可以实现。

标签: java design-patterns architecture microservices resiliency


【解决方案1】:

我建议不要使用 NIH 综合症,并依赖于成熟的技术,该技术可以满足您开箱即用的所有可靠性要求。

Cadence Workflow 能够轻松支持您的用例。

Cadence 提供了许多构建自定义任务编排解决方案难以匹敌的功能:

  • 内置指数重试,无限期间隔
  • 故障处理。例如,如果在配置的时间间隔内两次更新都无法成功,它允许执行通知另一个服务的任务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖。例如,在发生不可恢复的故障时实现调用链或补偿逻辑 (SAGA)
  • 提供对当前更新状态的完整可见性。例如,当使用队列时,您知道队列中是否有一些消息,并且您需要额外的数据库来跟踪整体进度。使用 Cadence 记录每个事件。
  • 能够取消正在进行的更新。
  • 分布式 CRON 支持

请参阅 the presentation,了解 Cadence 编程模型。

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 2019-04-10
    • 2021-04-23
    • 1970-01-01
    • 2021-06-20
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多