当前位置: 首页 > 知识库问答 >
问题:

使用消息传递的微服务和SOA

杨豪
2023-03-14

我对尝试将微服务/SOA作为一种体系结构非常感兴趣,并且很难对服务之间的集成进行概念化。

我喜欢使用消息传递将客户端与服务分离的想法,但不理解系统如何独占地使用它。典型的异步操作和发布/订阅显然是有意义的——比如创建新订单、广播数据以进行报告等。我不明白的是,人们是否通常尝试在常见的请求/回复场景中使用消息传递——例如,用户点击他们的“个人资料”页面,而需要在页面上呈现的部分数据来自用户服务。

我知道常见的消息传递实现提供了类似REST的回复/请求功能,但这通常用于简单的数据请求吗?微服务似乎更有可能既公开RESTendpoint,又向消息代理注册它将参与的不同类型的通信,但是我看到的所有这些SOA和微服务架构的演示似乎都表明它们只使用其中之一。

感谢任何阐述/经验!

共有3个答案

国晟睿
2023-03-14

我刚开始学习微服务,所以这绝不是一个完美的答案。不过,这是我根据目前的理解得出的看法。

如果您正在基于事件创建微服务,那么消息代理将发挥巨大作用。假设您有一个名为CreateUserService的服务,它只负责收集创建用户所需的数据,而不是持久化数据。然后将此数据发布到队列。

createUser队列DuplicateUserService、UserDataStore等的订户...然后可以对每个服务中的数据做出相应的反应。

最后,客户端从另一个服务接收回数据,其中包含关于尝试的事件的相关信息。

司马庆
2023-03-14

我认为,当您询问在请求/响应中使用“消息传递”的频率时,您可能是指异步通信。

我将从与这里的一些答案不同的(相反的)角度来看,并说您应该几乎总是使用异步,即使在请求/响应中也是如此。这是因为异步意味着您不会阻止程序等待响应,并且您的程序可以在等待响应时继续进行其他处理。

例如,假设您正在实现Twitter的主页。你向不同的微服务发出一堆请求(“给我推荐的关注者”、“给我最新的时间表”等等)。").您不希望阻塞和序列化所有这些请求。你想让它们异步运行,这样可以创造更好的用户体验,因为当响应返回时,它们会实时更新用户界面。

Twitter使用Finagle(http://twitter.github.io/finagle/guide/index.html)这正是(异步RPC)。它不做消息传递系统会做的一些事情(特别是,它实际上与JVM绑定,并且不实现流控制或队列),但它确实实现了异步请求/响应。

许振海
2023-03-14

我之前已经发布过这方面的文章 - 但一般来说,同步操作(例如,用户单击按钮并期望返回一些数据)是同步的,这是有原因的。

也就是说,同步——不是因为用于处理呼叫的技术——而是因为用户一方固有的、通常不灵活的期望,即事情应该实时发生,而不是“离线”发生(即使大多数时候没有实质性的区别)。

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

与所有事情一样,异常比比皆是(并且可能产生全新的对话),但某些类型的用户调用可以而且应该根据情况“离线”处理。

然而,我确实觉得你断言的重点是:

我喜欢使用消息传递将客户端与服务分离的想法

有点错过了重点。我们实际上并不想将客户端(或消费者)和服务分离。

我们期望一个客户,比如说,应付账款业务能力与应付账款微服务高度耦合。

类似地,我们期望服务endpoint签名bool ProcessTransact(事务事务)与此类操作的使用者之间存在高度耦合。

解耦变得非常重要的地方是支持不同业务功能的服务之间的解耦。

正是在这一点上,消息传递的优势真正发挥了作用。让我知道你的想法,如果这对你有帮助的话。

 类似资料:
  • 我正在计划开发一个基于微服务的架构应用程序,当我阅读Ronnie Mitra的书《微服务架构》时,我决定使用Kafka进行内部通信;马特·麦克拉蒂;迈克·阿蒙森;伊拉克利·纳达雷什维利说: 让微服务直接与消息代理(如RabbitMQ等)交互很少是个好主意。如果两个微服务通过消息队列通道直接通信,那么它们共享一个数据空间(通道),我们已经详细讨论了两个微服务共享一个数据空间的弊病。相反,我们可以做的

  • 我听说亚马逊使用HTTP作为其基于微服务的架构。另一种方法是使用RabbitMQ或Solace Systems这样的消息传递系统。我个人对基于Solace的微服务架构有经验,但从未使用过REST。 知道像Amazon、Netflix、UK Gov等各种大联盟实现使用什么吗? 其他方面是,在微服务中,还需要以下东西(除了其他东西): *模式匹配 *异步消息传递。接收系统可能已关闭 *发布订阅 *缓存

  • 我们正在设计我们的新系统,它很可能是从头开始编写的,因为旧系统非常非常旧。对我们的系统来说,保留系统中发生的所有事情的审计跟踪日志非常重要。 由于审计跟踪的重要性,我们决定遵循事件源架构以获得它的所有好处。另一个关键因素是我们有多个团队在不同的“域”上工作。也就是说,我们想将每个域拆分为自己的服务(微服务架构),这样每个团队都可以独立工作。 我们面临的最大问题是谁将负责微服务之间的事件共享。例如,

  • 我知道消息传递系统是无阻塞和可扩展的,应该在微服务环境中使用。 我质疑的用例是: 假设有一个admin dashboard客户机负责发送API请求以创建Item对象。有一个微服务提供APIendpoint,它使用一个MySQL数据库来存储项目。还有一个微服务使用弹性搜索进行文本搜索。 如果此管理仪表板客户端: a.发送2个API调用;1次调用MySQL服务和另一个elasticsearch服务 或

  • 我们有基于微服务架构的应用程序的第一个版本。我们使用REST进行外部和内部通信。 现在我们想从 CP(CAP 定理)* 切换到 AP,并使用消息总线在微服务之间进行通信。有很多关于如何基于 Kafka、RabbitMQ 等创建事件总线的信息。但是我找不到任何结合 REST 和消息传递的最佳实践。例如,您创建一个汽车服务,您需要添加不同的汽车组件。为此,将 REST 与 POST 请求一起使用会更有

  • 新服务器密钥是否仅限于消息传递? 说明:在firebase项目设置中,我可以获得“旧”和新服务器密钥(云消息选项卡)。旧版本无法通过发送推送通知https://fcm.googleapis.com/fcm/send 因为响应说它是一个遗留服务器密钥。但在这里,它可以被限制在某些谷歌API中https://console.developers.google.com/apis. 谷歌API控制台中没有