Service 当面向消息的中间件完成任务时,为什么还要费心进行服务发现呢?

Service 当面向消息的中间件完成任务时,为什么还要费心进行服务发现呢?,service,service-discovery,mom,etcd,consul,Service,Service Discovery,Mom,Etcd,Consul,我知道etcd/concur/$正试图解决的问题。服务消费者需要与服务提供者交谈,一个流动性极大的分布式系统需要一种机制将两者结合起来 然而,“服务消费者的请求到哪里去了?”这个问题由来已久,IMO已经用MOM——面向消息的中间件解决了 在MOM中,服务消费者不关心服务提供商住在哪里。他们只是发送一条消息,并让消息总线负责将消息路由到适当的使用者。可以有多个提供程序执行相同的操作(基于队列的循环),也可以有版本化的提供程序(/v1/request转到一个,/v2/request转到另一个) 这是

我知道etcd/concur/$正试图解决的问题。服务消费者需要与服务提供者交谈,一个流动性极大的分布式系统需要一种机制将两者结合起来

然而,“服务消费者的请求到哪里去了?”这个问题由来已久,IMO已经用MOM——面向消息的中间件解决了

在MOM中,服务消费者不关心服务提供商住在哪里。他们只是发送一条消息,并让消息总线负责将消息路由到适当的使用者。可以有多个提供程序执行相同的操作(基于队列的循环),也可以有版本化的提供程序(/v1/request转到一个,/v2/request转到另一个)

这是一个简单、强大的集成模式,它将服务接口与其实现完全解耦

但我看到了这种对发现服务提供商的奇怪痴迷,这似乎在消费者和提供商之间造成了紧密耦合(此外还有一些其他反模式)


那么,我错过了什么?TIA.

在MOM中,所有的东西都通过总线,因此它可能成为一个瓶颈。使用服务发现,消费者“一次”查找生产者(好的,可能需要一段时间后再次检查),然后“直接”(好的,可以通过代理)与生产者对话


或者,如果您更喜欢吸引人的短语:智能端点和哑管道vs(我猜)哑端点和智能管道

就我个人而言,我不认为这两者都是这种类型的架构。您可以使用服务发现来查看当前可用的服务,并订阅MOM,以获取您知道将在那里发生的事件。如果找不到所依赖的服务,可以发出警报。当一个频道没有出版商时,并非所有的妈妈都会让你知道

您还可以通过服务发现的方式将它们结合在一起,在服务发现中,您可以找到您想要直接联系的服务,例如,不执行任何操作的数据存储,并且仍然使用MOM订阅其他系统所做更改的事件。也不是所有用例都适合作业队列,因为有些任务必须同步解决,然后服务发现是拥有动态环境的好方法


我本人确实更喜欢异步MQ,而且我认为如果您做得好,通过负载平衡、冗余、使用单独的读写器进行集群等,您可以轻松地获得很好的稳定性、可扩展性和所有组件的标准化通信方式

一个用例示例是,如果您有多条消息总线(用于不同的消息类型),并且您正在构建一个集中式消息调度程序。service registry可用于添加或删除消息总线,但我也有同样的困惑。服务发现和恢复技术(如断路器和重试)的大多数示例都假定服务之间的同步通信。。。