MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka(外加redis对比及其实现)
rocketmq 4.3开始支持事务https://www.cnblogs.com/hzmark/p/rocket_txn.html
参考:rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较
redis vs rabbitmq
可靠消费
Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理
RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费
可靠发布
Reids:不提供,需自行实现
RabbitMQ:具有发布确认功能,保证消息被发布到服务器
高可用
Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案
RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作
持久化
Redis:将整个Redis实例持久化到磁盘
RabbitMQ:队列,消息,都可以选择是否持久化
消费者负载均衡
Redis:不提供,需自行实现
RabbitMQ:根据消费者情况,进行消息的均衡分发
队列监控
Redis:不提供,需自行实现
RabbitMQ:后台可以监控某个队列的所有信息,(内存,磁盘,消费者,生产者,速率等)
流量控制
Redis:不提供,需自行实现
RabbitMQ:服务器过载的情况,对生产者速率会进行限制,保证服务可靠性
出入队性能
对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。
测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。
除了本身的特性外,我们纯属是因为使用了分布式架构,但是系统业务量不大,为了没有那么多的中间件,将redis作为消息队列进行解耦也是可以
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
发布命令
[root@localhost bin]# ./redis-cli
127.0.0.1:> auth meredis
OK
127.0.0.1:> PUBLISH redisChat "Redis is a great caching technique"
(integer)
127.0.0.1:> publish hs:me:channel:Memedame abc
(integer)
127.0.0.1:> publish hs:me:channel:Memedame {"a":"b"}
Invalid argument(s)
127.0.0.1:> publish hs:me:channel:Memedame "{\"a\":\"b\"}"
(integer)
java中实现订阅
package com.xxx.me.mq.listener; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annometion.Autowired;
import org.springframework.dame.redis.connection.Message;
import org.springframework.dame.redis.connection.MessageListener;
import org.springframework.dame.redis.core.RedisTemplate;
import org.springframework.dame.redis.serializer.RedisSerializer; /**
*
消息格式要求:
Map<String,Object>以及Map<String,List<Object>>,例如:"Dict",List<Dict>或"Param",Param。目前支持如下:
Dict、Param
* <p>Title: RedisMsgPubSubMemedameListener</p>
* <p>Description: </p>
* @author zjhua
* @date 2019年1月25日
*/
public class RedisMsgPubSubMemedameListener implements MessageListener {
private Logger logger = LoggerFactory.getLogger(RedisMsgPubSubMemedameListener.class); @Autowired
private RedisTemplate<String, Object> redisTemplate; @Override
public void onMessage( final Message message, final byte[] pattern ) {
RedisSerializer<?> serializer = redisTemplate.getValueSerializer();
// message.getBody()是Redis的值,需要用redis的valueSerializer反序列化
logger.info("Message receive-->pattern:{},message: {},{}", new String(pattern),
serializer.deserialize(message.getBody()),
redisTemplate.getStringSerializer().deserialize(message.getChannel()));
logger.info(message.toString());
}
}
发布
redisTemplate.convermendSend("hs:me:channel:Memedame", json);
xml
<!-- 配置redis发布订阅模式 -->
<bean id="redisMessageListenerConmeiner" class="org.springframework.dame.redis.listener.RedisMessageListenerConmeiner">
<property name="connectionFactory" ref="connectionFactory" />
<property name="messageListeners">
<map>
<entry key-ref="memedameMessageListenerAdapter">
<bean class="org.springframework.dame.redis.listener.ChannelTopic">
<constructor-arg value="hs:me:channel:Memedame"></constructor-arg>
</bean>
</entry>
</map>
</property>
</bean> <bean id="memedameMessageListenerAdapter" class="org.springframework.dame.redis.listener.adapter.MessageListenerAdapter">
<constructor-arg ref="redisMsgPubSubMemedameListener"></constructor-arg>
</bean> <bean id="redisMsgPubSubMemedameListener" class="com.xxx.me.mq.listener.RedisMsgPubSubMemedameListener"></bean>
MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka(外加redis对比及其实现)的更多相关文章
- MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka
几种MQ产品说明: ZeroMQ : 扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码 RabbitMQ :结合erla ...
- MQ选型对比RabbitMQ RocketMQ ActiveMQ
原文:MQ选型对比RabbitMQ RocketMQ ActiveMQ 几种MQ产品说明: ZeroMQ : 扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装 ...
- RabbitMQ,RocketMQ,Kafka 消息模型对比分析
消息模型 消息队列的演进 消息队列模型 发布订阅模型 RabbitMQ的消息模型 交换器的类型 direct topic fanout headers Kafka的消息模型 RocketMQ的消息模型 ...
- MQ选型之RabbitMQ
RabbitMQ是部署最广泛的开源消息代理.[官方原话] 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列(message queue),队列我们可以理解为管道.以管道的方式做消息传递. ...
- RocketMQ和Kafka的差异对比
Broker差异 主从差异: kafka的master/slave是基于partition维度的,而rocketmq是基于broker维度的:kafka的master/slave是可以切换的,而roc ...
- 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK
前提背景 大家都知道,市面上有许多开源的MQ,例如,RocketMQ.Kafka.RabbitMQ等等,现在Pulsar也开始发光,今天我们谈谈笔者最常用的RocketMQ和Kafka,想必大家早就知 ...
- MQ选型对比ActiveMQ,RabbitMQ,RocketMQ,Kafka 消息队列框架选哪个?
最近研究消息队列,发现好几个框架,搜罗一下进行对比,说一下选型说明: 1)中小型软件公司,建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便.不考虑r ...
- ActiveMQ、RabbitMQ、RocketMQ、Kafka 对比(图示)
RabbitMQ 和 Kafka 对比,一篇好的介绍文章:https://my.oschina.net/u/236698/blog/501834 ActiveMQ.RabbitMQ.RocketMQ. ...
- 我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比(转载)
转载自:https://www.sojson.com/blog/48.html 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: ...
随机推荐
- node使用 log4js
log4js //配置日志的输出级别,共ALL<TRACE<DEBUG<INFO<WARN<ERROR<FATAL<MARK<OFF八个级别,defau ...
- php curl POST multipart/form-data与application/x-www-form-urlencode的区别
背景 CURL在 a.php 中以 POST方式向 b.php 提交数据,但b.php无法接收到数据,而 CURL 操作显示成功. 原来,"传递一个数组到CURLOPT_POSTFIELDS ...
- centos5 升级到centos6
From http://www.linuxquestions.org/questions/linux-newbie-8/yum-update-error-4175476250/ 对开发组的一个服务器执 ...
- Robot FrameWork使用中常见问题收集
1.“假死”现象 在完成一个模块的脚本编写后,多次运行没问题,但是隔了几天再来运行的时候,发现脚本运行会出现浏览器那边不动了,脚本这边的时间一直在跑. 问题原因及解决方法: 问题解决了,原因是**dr ...
- unity3d-游戏实战突出重围,第三天 绘制数字
实现效果: 准备资源 using UnityEngine; using System.Collections; public class hznum : MonoBehaviour { //存储图片资 ...
- Error #2148
参考:https://blog.csdn.net/watersevenmmfx/article/details/52980804 chrome flash 安全沙箱冲突 SecurityError: ...
- 编写一个程序解决选择问题。令k=N/2。
import java.util.Arrays; /** * 选择问题,确定N个数中第K个最大值 * @author wulei * 将前k个数读进一个数组,冒泡排序(递减),再将剩下的元素逐个读入, ...
- kafka 单机配置
http://blog.csdn.net/jingshuigg/article/details/24439637 . su root : chown -R hadoop:hadoop version- ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺1.0
软工网络15团队作业4--Alpha阶段敏捷冲刺1.0 1. 各个成员在 Alpha 阶段认领的任务,以及整个项目预期的任务量(使用整数表示,与项目预估的总工作小时数一致.比如项目A预估需120小时才 ...
- ps 证件照(1,2寸)
制作证件照 9*9打印 1,1寸 图片裁剪 2, 2寸 图片裁剪 3,将裁剪完成后的图片选择添加画布 Alt Ctrl c 将高和宽各加20px ,背景选择白色 4,将得到的带有白色 ...