使用微服务的多个实例存储和转发设计模式

时间:2019-06-24 06:40:33

标签: java design-patterns architecture microservices resiliency

我正在设计一种服务,该服务将接收必须仅执行一次的请求(由于存在唯一的ID,因此可以多次接收)。

流为:

  

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

因此,我正在通过HTTP接收一堆请求,并且希望进行一些转换,检查,将该请求存储在数据库中,并且也通过HTTP发送给供应商服务。

我的问题是:

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


问题:

  • 如果myservice实例之一在将请求发送到供应商服务时出现故障怎么办?
  • 如何监视是否有大量未转发的请求?
  • 如何避免其他编排服务?
  • 如何避免另一个单实例服务有效监视数据库并转发所有未转发的请求。
  • 如何最大限度地减少外部依赖性-例如我知道这里的某种队列可能会帮助解决此问题,但是我试图查看是否可以避免这种情况。

1 个答案:

答案 0 :(得分:0)

我建议不要使用NIH语法,而要依赖成熟的技术,该技术可以立即满足您的所有可靠性要求。

Cadence Workflow能够以最小的努力支持您的用例。

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

  • 构建具有无限到期间隔的指数重试
  • 故障处理。例如,它允许执行一个任务,如果在配置的时间间隔内两次更新均未成功,则该任务会通知另一服务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖性。例如,在无法恢复的故障(SAGA)的情况下实现呼叫链或补偿逻辑的链接
  • 完全了解更新的当前状态。例如,当使用队列时,您就会知道队列中是否有某些消息,并且需要其他数据库来跟踪总体进度。使用Cadence可以记录每个事件。
  • 能够取消正在进行的更新。
  • 分布式CRON支持

请参见介绍Cadence编程模型的the presentation