我应该改变我们的微服务通信方式吗?

Should I change how our microservices communicate?

我们的应用程序由 7 个微服务组成,这些微服务有一些相互通信。目前我们正在使用微服务向其发布事件的简单存储队列(事件数量相对较少)。然后我们为每个可能调用另一个微服务的队列都有一个 azurefunction。这对我们来说工作正常,现在服务使用大约 20 个具有相应功能的队列。

现在我们需要处理一个 blobstorage 事件,我进行了一些谷歌搜索,开始变得非常困惑。突然有很多问题:

非常感谢您对这个问题的任何建议或见解。

谢谢

当您将通知浮动到多个订阅者时,EventGrid 非常有用。你也是这样吗?

一个例子是延迟消息。使用队列,您可以延迟消息,但不能使用 EventGrid。何时选择存储队列或服务总线取决于您的具体要求。你需要de-duplication吗?还是预约送货?如果你这样做,服务总线就是这种方式。否则存储队列就足够了。

这在很大程度上取决于你如何使用队列消息,你可以看看这个比较:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-azure-and-service-bus-queues-compared-contrasted

如果您不需要排序并且对消息量、大小或 TTL 没有严格限制,则可以坚持使用存储队列。

首先,我想推荐这两篇文章,它会澄清你对这些服务的大部分疑惑:

关于Event Grid,它就像是发布者和订阅者之间的桥梁,发布者发送消息时会忘记消息是否已经处理,如果receiver\subscriber 不承认处理成功

正如您所提到的,存储队列有局限性,例如 blob 触发函数,可能还有 Service Bus,但这取决于您的设计要求。在转向事件网格之前,我想指出一些您可能需要考虑的事项。

  • 存储队列和服务总线不关心你的消息模式,在事件网格中你必须根据他们的模式创建一个自定义事件来包装你的事件,所以发布者和订阅者必须理解事件网格,这不是什么大问题,但现在您已将双方耦合到事件网格。

  • 如果您想将事件直接发送到您的 micro-service,您必须在您的服务中实施订阅验证,否则该服务将无法接收事件

  • 事件网格仅在 24 小时内重试您的消息传递,如果您的服务已关闭或未正确处理消息的时间超过 24 小时,这将使事件失效。目前无法查询死消息。存储队列和服务总线是可配置的,您可以将消息保留多长时间,并且可以保留很多天。

  • 您的服务 web-hook 必须在 60 秒内确认收到事件(http 200 或 202),否则将视为失败。如果你的操作比那个长,你应该将它发送到队列并处理来自你的服务的锁定。

可能还有更多限制,但这些是我现在记得的,可能很快就会改变,我认为事件网格是一项伟大的技术,仍处于早期阶段,还有很多需要改进的地方,我只会重新开始作为 Azure 管理事件的中心,我认为它还没有准备好用作应用程序集成器。

关于您对队列管理器的评论,对于服务总线,您有服务总线资源管理器,对于 Azure 存储,您有 Azure 存储资源管理器,您可以在其中检查队列中的消息,这与服务总线不同, 但有帮助。