微服务和面向服务架构(SOA)的消息传递使用

22

我对尝试使用微服务/SOA架构非常感兴趣,但很难理解服务之间的集成如何实现。

我喜欢使用消息传递来解耦客户端和服务端,但不明白一个系统如何完全使用它。异步操作和发布/订阅等典型的场景都是有意义的——例如创建新订单、广播用于报告的数据等。但我不明白是否通常尝试将消息传递用于常见的请求/响应场景——例如用户点击其“个人资料”页面,页面上需要呈现的部分数据来自用户服务。

我知道常见的消息传递实现提供类似于REST的请求/响应功能,但这种功能是否经常用于简单的数据请求?看起来更可能的是,微服务既会暴露REST终点,也会向消息代理注册不同类型的通信,但是我观看的所有SOA和微服务架构的演示似乎都暗示只使用其中一种...

感谢任何详细说明/经验!

5个回答

16

我之前在这里发过类似的帖子 - 但总的来说,同步操作(例如用户点击按钮并期望得到一些数据)之所以是同步的是有原因的。

也就是说,同步-不是由于处理调用的技术而产生的,而是由于用户内置的且普遍缺乏灵活性的期望,即事情应该实时发生而不是“脱机”(即使大多数时候没有任何实质性区别)。

因此,通常不明智将任何离线或异步技术栈放在用户和他们预期的响应之间。

像所有事物一样,例外很多(并可能引发全新的讨论),但某些类型的用户调用可以根据情况进行“离线”处理。

然而,我认为你所肯定的重点:

我喜欢使用消息传递来解耦客户端和服务的理念

有些遗漏了。我们实际上不想要将客户端(或消费者)与服务解耦。

例如,我们期望Accounts Payable业务能力的客户端与accounts payable微服务高度耦合。

同样,我们期望一个服务终端点签名bool ProcessTransaction(Transaction transaction)与这种操作的使用者之间有很高程度的耦合。

在支持不同业务能力的服务之间进行解耦真正重要的地方就是在这里。

而这正是消息传递的好处所在,让我知道你的想法,是否有帮助到你。


2
非常好,谢谢!这正是我所怀疑的,从应用程序用户的角度来看,异步调用并不适用于任何自然工作流程...似乎会很快变得混乱。您提到的不要将消费者与服务解耦的部分,更加强调了这一点 - 异步似乎是服务器之间场景中的一个很好的解决方案,其中业务能力不需要响应才能完成其目的。 - user2868740
1
虽然业务能力通常需要某种响应才能完成——这也可以通过异步通道启用。在此背景下,“异步”和“单向”之间存在重要区别。当响应(以及随之而来的最终一致性)不是时间关键时,可以使用消息传递。 - tom redfern

4
我认为当你询问“消息传递”在请求/响应中使用的频率时,你可能是指异步通信。
与此处某些答案不同(相反),我会说你几乎总是应该使用异步,即使在请求/响应中。这是因为异步意味着你不会阻塞程序等待响应,而且程序可以在等待响应时继续执行其他处理。
例如,假设你正在实现 Twitter 的主页。你向不同的微服务发送了一堆请求(“获取推荐关注者”,“获取最新时间线”等)。你不想阻塞和序列化所有这些请求。你希望异步地发出它们,这样可以创造更好的用户体验,因为随着响应的到来,它们可以实时更新 UI 。
Twitter 使用 Finagle(http://twitter.github.io/finagle/guide/index.html)来实现这一点(异步 RPC)。它不执行一些消息系统所做的事情(特别是它与 JVM 紧密相关,并且它不实现流量控制或队列),但它确实实现了异步请求/响应。

0
我不明白的是,人们是否通常尝试在常见的请求/响应场景中使用消息传递 - 例如,用户点击他们的“个人资料”页面,页面上需要呈现的一部分数据来自用户服务。

关键是要完全避免请求/响应。如果您的整个堆栈允许异步消息传递,包括通过使用类似于单页应用程序(SPA)中的WebSocket的Web前端,那么从技术上讲这是可能的。您可以查看Typesafe的Reactive Maps模板(https://www.typesafe.com/activator/template/reactive-maps-java)以获取实际示例。

0

我刚开始学习微服务,所以这并不是一个完美的答案。但这是基于我的当前理解和个人观点。

如果你正在创建基于事件的微服务,那么消息代理将扮演重要角色。比如说你有一个名为CreateUserService的服务,它只负责收集创建用户所需的数据而不是持久化数据。然后将这些数据发布到队列中。

订阅者可以是createUser队列的DuplicateUserService、UserDataStore等等,每个服务都可以根据数据做出相应的反应。

最终,客户端从另一个服务接收到有关尝试事件的相关信息。


-1

我没有使用REST,但我使用WSDL来允许层之间的通信。服务之间的集成非常简单,它们像后端嵌套函数一样相互交谈,或者如果请求从服务器跳转,则仅使用XML和JSON。

这里的服务器是内部Web服务的主机。根据要求,可以为各个服务提供排队。但最终,只有一个响应从后端发送给调用方。


谢谢您的回复,我特别想知道在请求/响应场景中使用消息传递(基于JMS/AMQP等)的情况。 - user2868740

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接