rabbitmq 发布者/订阅者和生产者/消费者在分布式系统消息传递中的区别?[副本]

6mw9ycah  于 8个月前  发布在  RabbitMQ
关注(0)|答案(5)|浏览(77)

此问题已在此处有答案

Publish/Subscribe vs Producer/Consumer?(4个答案)
15天前关闭。
发布者/订阅者和生产者/消费者模式有什么区别?
我经常听到人们交替使用“发布者”和“制作者”这两个术语,但我不认为它们是一样的。

zxlwwiss

zxlwwiss1#

通常情况下,我不认为有一个确切的,独特的,明确的答案,因为不同的工具和作家使用的话有点不同。但是,以下是它们通常的使用方式:

发布/订阅为“1对N”:当一个发布者生成一条消息时, 所有 * 订阅的接收者都会得到它。
生产者/消费者是“1对1”或“1对(N中的1)”。也就是说,当生产者产生消息时, 一个 * 接收者得到它。可能只有一个可能的接收器开始,或者可能有一个池的可能接收器可用,但如果有**几个可用,其中一个得到它,其余的没有。

发布/订阅通常是关于分发 * 信息 *,每个(订阅)方都需要知道它。生产者/消费者在分配任务时特别有用,关键是“某人”执行消息所暗示的任何操作。

bsxbgnwa

bsxbgnwa2#

在基于事件的系统中,这两个概念在通信方面有相似之处,有人产生一条消息并通过一些服务或协议发送它,另一个服务接收这个消息(如果它订阅/连接到那个主题/服务)。我认为它们也有一些差异,但这些差异来自于你使用的技术。在这个例子中,我将使用两个流行的服务,Kafka和Redis。

生产者/消费者- Kafka

让我们想象两个微服务,我们称之为ProducerMicroservice和ConsumerMicroservice。生产者负责创建一个消息/事件/有效负载,或者你想怎么称呼它。此服务建立到Kafka的连接,并且连接持续,除非发生中断。每次你想通过Kafka发送东西时,你都需要有一个连接的客户端,否则它将无法工作。消费者也连接到Kafka,但扮演消费者的角色,它正在侦听事件流,如果客户端断开连接,则不会收到任何事件/有效负载。因此,这种生产者和消费者的模式需要有一个有效的沟通工作的积极联系。显然,Kafka有它的解决方案,如“如果生产者发送了一条消息,但消费者断开了连接,会发生什么?“或自动重新连接等。如果你感兴趣的话,我会在最后留下一篇关于Kafka是如何工作的文章

发布/订阅- Redis在这个例子中,我们将使用两个微服务,分别是PublisherService和SubscriberService。两者都示例化了一个Redis客户端,允许你发布或订阅Redis中发布的消息。因此,如果我从发布者服务发送消息,并且订阅者服务已订阅,则消息将被成功接收,否则消息将不会被接收,除非您以某种方式实现某些重试策略。

因此,简而言之,当我们使用术语发布者或生产者时,我们谈论的是向特定服务(Kafka,Redis等)发送/发布/生成消息的实体,而当我们谈论订阅者/消费者时,我们理解它是接收端。我想实际的区别在于在生产者和消费者之间进行交易的代理以及它如何处理通信。
消费者/生产者模型我发现它更健壮,它有重连接协议,它也有消费者组,以防你有单个微服务的多个副本(这样你只会在其中一个副本中接收消息)。另一端的发布/订阅如果你有多个副本,所有的副本都将订阅消息,除非你做一些自定义配置,这会使它更复杂。
当我希望多个副本接收相同的发布消息时,我使用发布/订阅;当我只希望其中一个副本接收信息时,我使用生产者/消费者
当我说副本时,我的意思是它是微服务的副本(水平扩展)
https://aiven.io/blog/kafka-simply-explained
我希望这对你有帮助,如果还有别的事,请告诉我

bfnvny8b

bfnvny8b3#

发布者/订阅者(Pub/Sub)

特性:

***解耦:**Pub/Sub比Producer/Consumer更解耦。发布者和订阅者不需要知道对方。
***一对多:**一条消息可以被多个订阅者接收。
***主题过滤:**邮件通常按主题分类。订阅者可以订阅一个或多个主题。
***异步:**一般异步操作。
***无状态:**通常情况下,发布/订阅是无状态的,意味着每条消息都是独立的。

用例:

  • 实时分析
  • 监测系统
  • 类似广播的用例(例如,新闻源)

生产者/消费者

特性:

***耦合:**通常更紧密地耦合,因为消费者经常从生产者放置消息的特定队列中拉取消息。
***一对一或一对几:**通常一个消息由一个消费者处理,尽管存在变化。
***基于队列的过滤:**通常采用队列存储消息,按照消息到达的顺序进行处理。
***同步或异步:**可以同步和异步操作。
***状态:**可以维护状态,特别是当消息顺序很重要时。

用例:

  • 任务队列
  • 点对点信息系统
  • 工作流系统

总结

1.**耦合性:**Pub/Sub通常是更解耦的。
1.**消息传递:**在发布/订阅中,一条消息可以发送给多个订阅者。在生产者/消费者中,通常一条消息传递给一个消费者。
1.**过滤:**Pub/Sub使用主题过滤,Producer/Consumer一般使用队列过滤。
1.**异步性:**两者都可以异步,但Producer/Consumer也可以同步工作。
1.**状态:**发布/订阅通常是无状态的,生产者/消费者可以根据需要维护状态。

yk9xbfzb

yk9xbfzb4#

发布者/订阅者

**发布者:**生成消息并发送给消息代理的流程。
**订阅者:**从消息代理接收消息的进程。
**Message Broker:**一个中央服务器,用于存储和转发发布者到订阅者的消息。

生产者/消费者

**Producer:**生成消息并将其放入消息队列的进程。
**消费者:**从消息队列中移除消息并进行处理的进程。

dced5bon

dced5bon5#

发布/订阅和生产者/消费者模型之间存在差异。

发布/订阅:订阅者订阅发布者。发布服务器发布的每条消息都将发送给所有订阅服务器。也就是说,所有订阅者都收到相同的消息。(想想报纸或杂志的订阅。所有订阅者收到相同的杂志或报纸)
生产者/消费者:生产者产生的每条消息都将由一个消费者消费。这是一种将工作负载分配给多个消费者的机制。(想想超市里的几台收银机。每个顾客都去一个收银机。顾客就像是产生的信息,而收银机就是消费者)

已询问Here

相关问题