rabitmq,redis以及kafuka作为消息队列的区别[通俗易懂]

rabitmq,redis以及kafuka作为消息队列的区别[通俗易懂]kafukakafuka涉及到的名词词意解释:Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲、异步通信、汇集日志、系统解耦等方面。相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的读写性能。针对Kafka性能方面进行简单分析,相关数据请参考:https://segmentfault.com/a/119000000398…

大家好,又见面了,我是你们的朋友全栈君。

kafuka

kafuka涉及到的名词词意解释:

Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲、异步通信、汇集日志、系统解耦等方面。相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的读写性能。

针对Kafka性能方面进行简单分析,相关数据请参考:https://segmentfault.com/a/1190000003985468,下面介绍一下Kafka的架构和涉及到的名词:

Topic:用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上。

Partition:是Kafka中横向扩展和一切并行化的基础,每个Topic都至少被切分为1个Partition。

Offset:消息在Partition中的编号,编号顺序不跨Partition。

Consumer:用于从Broker中取出/消费Message。

Producer:用于往Broker中发送/生产Message。

Replication:Kafka支持以Partition为单位对Message进行冗余备份,每个Partition都可以配置至少1个Replication(当仅1个Replication时即仅该Partition本身)。

Leader:每个Replication集合中的Partition都会选出一个唯一的Leader,所有的读写请求都由Leader处理。其他Replicas从Leader处把数据更新同步到本地,过程类似大家熟悉的MySQL中的Binlog同步。

Broker:Kafka中使用Broker来接受Producer和Consumer的请求,并把Message持久化到本地磁盘。每个Cluster当中会选举出一个Broker来担任Controller,负责处理Partition的Leader选举,协调Partition迁移等工作。

ISR(In-Sync Replica):是Replicas的一个子集,表示目前Alive且与Leader能够“Catch-up”的Replicas集合。由于读写都是首先落到Leader上,所以一般来说通过同步机制从Leader上拉取数据的Replica都会和Leader有一些延迟(包括了延迟时间和延迟条数两个维度),任意一个超过阈值都会把该Replica踢出ISR。每个Partition都有它自己独立的ISR。

  1. 负载均衡:kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。
  2. Scale out:支持在线水平扩展。
  3. kafka的broker支持主备模式。
  4. 性能:kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
  5. 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。
  6. 同时支持离线数据处理和实时数据处理。

更多关于Kafka的数据,参考:https://segmentfault.com/a/1190000003985468

RabbitMQ

  1. RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。
  2. RabbitMQ实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。
  3. RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。
  4. rabbitMQ以broker为中心;有消息的确认机制,可靠性比较高。
  5. 可用性方面,rabbitMQ支持miror的queue,主queue失效,miror queue接管。

  6. rabbitMQ的负载均衡需要单独的loadbalancer进行支持。

redis

redis是一个基于Key-Value对的NoSQL数据库,开发维护很活跃。虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用

  1. redis的list数据结构可以实现轻量级的消息队列,处理少量消息时读写性能很高,当写入消息数量较大时(单机本地测试10k左右)写入性能会大大降低,读取性能受影响不大,依然很优秀。
  2. 比较适合在Web场景下作为队列服务使用
  3. redis作为消息队列不能实现消息的分类,还有没有确认机制,知道接收消息的消费者执行成功与否
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131840.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月30日 上午10:40
下一篇 2022年4月30日 上午11:00


相关推荐

  • 第二周CorelDRAW课总结

    第二周CorelDRAW课总结

    2021年5月25日
    136
  • tomcat docbase(fpga版本管理)

    TOMCAT的配置文件Server.XML里有一句:指定应用目录,其他参数先不说,聊聊appBase。1、appBase=”webapps“,这是默认值,代表:d:\tomcat\webapps这样的路径,谓之根目录;根目录下的ROOT目录,代表默认的主目录。访问:http://localhost:8080默认找d:\tomcat\webapps\ROOT下的文件(前提是没有d…

    2022年4月18日
    42
  • Python中的dir和help

    Python中的dir和help

    2021年8月19日
    62
  • pycharm每次运行需选择interpreter_pycharm怎么配置python环境变量

    pycharm每次运行需选择interpreter_pycharm怎么配置python环境变量在运行时就出现了下图情况,也不知道咋回事,之前删了些以为没用的文件夹,估计是删错了,环境没了。关闭后上面窗口后打开Settings→projectInterpreter选项你里面可能有多个,可以删掉重新添加一个有可能会遇到目录不为空的情况,因为你之前可能创建过这个文件路径啥的复制下面的路径,进去删掉原来的路径里的文件夹。然后再点击ok,重新创建一个…

    2022年8月27日
    12
  • 快速理解线程锁

    快速理解线程锁线程锁线程锁真的好麻烦啊!!!找了几篇博客发现写的都不一样相关联内容太多不容易理解所以现在需要理清什么是线程锁应用场景怎么用优缺点1.什么是线程锁机制多线程可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!so,不使用线程锁,可能导致错误啰嗦两句:比如你在银行取钱的同时你女朋友用支付宝取钱…

    2022年6月21日
    26
  • 列式数据库和行式数据库区别

    列式数据库和行式数据库区别转载自 https blog csdn net nieson2012 article details 列存储不同于传统的关系型数据库 其数据在表中是按行存储的 列方式所带来的重要好处之一就是 由于查询中的选择规则是通过列来定义的 因此整个数据库是自动索引化的 按列存储每个字段的数据聚集存储 在查询只需要少数几个字段的时候 能大大减少读取的数据量 一个字段的数据聚集存储 那就更容易为这种聚集存储设计更好的压缩 解压算法 传统的行存储和列存储的区别 1 数据是按行存储的 2 没有索引的查

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号