众所周知,kafka为了快速的读写,进行了零拷贝、mmap、单个partition中只能被一个consumer读取等等操作,由此牺牲了全局有序性和事务性等保证。

于是我就有一个猜想,如果手动去维护kafka的100%投递、幂等性等特性是否就可以使得kafka的读写速度高于rabbitmq,而且又同时具有rabbitmq的良好事务性呢?

知道我想到RocketMQ的设计,我感觉这就是对我的猜想的印证:

下面是关于阿里云中间件对RocketMQ的介绍:
RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
博客地址:http://jm.taobao.org/2016/04/01/kafka-vs-rabbitmq-vs-rocketmq-message-send-performance/

RocketMQ对kafka的优化:除了常规的全局有序行、幂等性、分布式一致性等操作。并解决了kafka多topic卡顿情况。

博客:http://jm.taobao.org/2017/03/03/RocketMQ-future-idea/

RocketMQ还对kafka的延迟(jvm卡顿和Page Cache)、降流保护(降流算法+Hystix的熔断思想)、高可用(故障转移和故障恢复等措施)

博客:http://jm.taobao.org/2017/01/26/20170126/

毕竟RabbitMQ是一个重量级框架,慢主要是其对事务性的支持考虑得过于全面,使得其性能损失很大。我个人感觉RocketMQ就是对kafka和RobitMQ得一个折中的实现。

就好像什么东西都会有它的缺陷一样,关于RabiitMQ和Kafka还有RocketMQ应对crash的能力:RocketMQ在一定层度上可以保证正常执行的时候的处理数据的不丢失等,但是面对crush的场景,也会出现数据丢失等情况。下面是断电的情况下,Kafka和RocketMQ都存在数据丢失。

博客原文:http://jm.taobao.org/2016/04/28/kafka-vs-rocktemq-4/
在这里插入图片描述

引用某位大牛的博客:为了保证RabbitMQ在退出或者crash等异常情况下数据没有丢失,需要将queue,exchange和Message都持久化。

该文章说明了RabbitMQ如何应对crush的数据不丢失:https://blog.csdn.net/u013256816/article/details/60875666

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐