如何在微服务世界中发布一个事件?

时间:2016-12-13 14:44:03

标签: amazon-web-services events microservices grpc

有许多书籍和博客详细说明了微服务之间基于事件的通信如何比直接相互调用的服务更容易维护。

然而,如何在AWS世界中实施?我在考虑主题,但它远非理想。

这种模式通常如何实现,以保证延迟,持久性,有保证的传递,幂等性等。

1 个答案:

答案 0 :(得分:0)

这里肯定有一些选择:

AWS Native Way

不确定为什么你认为主题远非理想?

SNS主题专为事件设计:

  1. 为每种事件类型创建一个SNS主题
  2. 为每个消费者创建一个SQS队列
  3. 将SQS队列订阅到消费者有兴趣订阅的SNS主题(事件)
  4. 关于它。

    优点:

    • 订阅在发布商或消费者之外进行管理 - 非常松散耦合
    • 缺点 - 你可以联系其他订阅者(例如电子邮件或api调用或lambda函数)来触发特定事件的特定操作 - 非常可扩展

    缺点:

    • 没有本地方式重播事件历史记录 - 例如新消费者获取有关订阅前发生的事件的信息

    Publisher使消费者可以使用事件历史记录

    这不是特定于AWS的,但另一种方法是让每个发布者公开允许消费者轮询新事件的API。通常,事件存储数据库存储事件,并且API允许缓存和检索新事件,因为X'语义。

    Atom协议经常用于以这种方式发布事件。

    优点:

    • 完整的活动历史记录可用于重播活动和追赶'新消费者
    • 基础设施不可知

    缺点:

    • 必须运行/维护事件存储和事件发布机制

    服务总线方法

    我不熟悉其他语言,但在.NET世界中,有两个大项目提供服务总线语义 - NServiceBusMass Transit

    两者都提供一系列的运输服务'用于活动交流。 NServiceBus有一个开源AWS SQS插件,可以使用SQS队列作为传输,但在编写本文时,NServiceBus会在每个发布者的本地持久性中维护订阅(然后,每个事件在发布到本地持久列表中的每个订阅者时转发)订阅)。

    关注?

    如果您能澄清您对SNS主题的疑虑,我很乐意扩大答案。