RabbitMQ或Kafka消息队列是1:1消息系统吗?

问题描述 投票:0回答:1

中提到的。回答,

消息队列是一个单向管道:一个进程向队列写入数据,另一个进程按顺序读取数据。

SysV消息队列就是一个例子


所以,我的理解是:

一个消息队列由两个进程使用,其中一个进程(生产者)在队列中插入一个项目,另一个进程(消费者)从队列中消费该项目。


1)RabbitMQ或Kafka消息队列是1:1的消息系统吗? 使用的是 只是 两个进程,其中一个进程写,另一个进程读......。

2) 消费者消费完物品后,物品是否会被删除?如果没有,为什么我们需要队列数据结构?为什么不直接使用共享内存?

java apache-kafka rabbitmq ipc message-queue
1个回答
1
投票

Kafka不是严格意义上的1:1消息系统。多个生产者可以向一个主题写入,多个消费者可以从这个主题中读取。而且,在Kafka中,多个消费者可以被分配到相同或不同的消费组。每条消息只由每个消费组的一个消费者消费(负载均衡),所有消费组都会收到每条消息的副本(当然,如果他们订阅了相应的主题,并且没有消息丢失)。关于这个过程,可以在这篇文章中找到很好的描述。使用消费者组的Kafka消息传递的可扩展性.

在Kafka中,所有的消息都会被持久地保存在磁盘上,并一直保存到 压实 收获,或者 retention.ms 通过,或者超过了日志大小。这是一个很高级的观点,这里有很多细微的差别。比如:消息是分段存储的,每个分段都包含多个消息。当一个消息的保留期过后,并不会在那一刻将其从段中删除,而是Kafka会等到该段中的所有消息都过期后,一次性删除整个段。另外,保留可能会在日志超过最大大小之前出现,反之亦然:日志可能会在保留期过去之前就超过大小。以此类推。只需阅读 文件 并关注关于 "日志清理 "和 "保留 "的话题。

Kafka消费者读取消息后,它既没有被压缩,也没有过期。所以,它并没有从日志中删除,而是停留在那里。这也意味着,如果需要的话,每条消息都可以被消费者重新阅读(直到它被完全删除)。如果你的一些消费者因为某些原因脱机了,无法处理他们进来的消息,这可能是有用的。它还可以实现一些有趣的功能,比如交易重播等等。持久性是Kafka的功能之一。

共享内存?好吧,严格来说,共享内存只允许在一个进程里面使用。所以当你需要从不同的进程中访问 "共享内存 "时,一般不能使用。而当你的应用在多个主机上运行时,也绝对无法拥有 "共享内存"。不过,也有内存中继器。像Redis可以作为消息中介,而且都是内存中的。但是,如果这样的broker因为某种原因重启,你就会失去一切。说到Redis:它有 两种持久性配置 专门用来处理重启。

我不清楚RabbitMQ的情况,但它可能会在消费者默认承认后删除消息。所以它更接近于1:1的心理模型。然而,RabbitMQ 雇用 磁盘持久性也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.