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对比及其实现)的更多相关文章

  1. MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka

    几种MQ产品说明: ZeroMQ :  扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码 RabbitMQ :结合erla ...

  2. MQ选型对比RabbitMQ RocketMQ ActiveMQ

    原文:MQ选型对比RabbitMQ RocketMQ ActiveMQ 几种MQ产品说明:     ZeroMQ :  扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装 ...

  3. RabbitMQ,RocketMQ,Kafka 消息模型对比分析

    消息模型 消息队列的演进 消息队列模型 发布订阅模型 RabbitMQ的消息模型 交换器的类型 direct topic fanout headers Kafka的消息模型 RocketMQ的消息模型 ...

  4. MQ选型之RabbitMQ

    RabbitMQ是部署最广泛的开源消息代理.[官方原话] 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列(message queue),队列我们可以理解为管道.以管道的方式做消息传递. ...

  5. RocketMQ和Kafka的差异对比

    Broker差异 主从差异: kafka的master/slave是基于partition维度的,而rocketmq是基于broker维度的:kafka的master/slave是可以切换的,而roc ...

  6. 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK

    前提背景 大家都知道,市面上有许多开源的MQ,例如,RocketMQ.Kafka.RabbitMQ等等,现在Pulsar也开始发光,今天我们谈谈笔者最常用的RocketMQ和Kafka,想必大家早就知 ...

  7. MQ选型对比ActiveMQ,RabbitMQ,RocketMQ,Kafka 消息队列框架选哪个?

    最近研究消息队列,发现好几个框架,搜罗一下进行对比,说一下选型说明: 1)中小型软件公司,建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便.不考虑r ...

  8. ActiveMQ、RabbitMQ、RocketMQ、Kafka 对比(图示)

    RabbitMQ 和 Kafka 对比,一篇好的介绍文章:https://my.oschina.net/u/236698/blog/501834 ActiveMQ.RabbitMQ.RocketMQ. ...

  9. 我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比(转载)

    转载自:https://www.sojson.com/blog/48.html 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: ...

随机推荐

  1. JS日期格式化扩展

    1.扩展 //扩展日期 Date.prototype.Format = function (fmt) { //author: meizz var o = { , //月份 "d+" ...

  2. cocos2d JS-(JavaScript) 类型检测与判断

    //检测类型 var str = "Hello World"; if (typeof str=="string") {//使用typeof来判断对象类型的一个例 ...

  3. mybatis运行原理

    mybatis运行原理 运行过程中涉及到的类或者接口 Resources(c) :用于加载mybatis核心配置文件 XMLConfigBuilder(c) :用于解析xml文件(核心配置文件) Co ...

  4. InstallShield :cannot rename directory ...

    InstallShield项目编译的生成目录文件夹需要关闭.

  5. Docker中mysql修改配置导致无法启动的docker容器

    宿主机中查找my.cnf文件 # find / -name my.cnf |grep '/etc/mysql/my.cnf' 找到: /data/docker/overlay2/dfc2ddbed53 ...

  6. 关于windows中80端口被占用

    很奇怪,windows7系统中的80端口被pid 为4 的system进程监听. 尝试关闭IIS功能,并在这期间进行过多次重启,均无效. 后来依照这篇文件解决的:https://www.jianshu ...

  7. while练习题

    # 1. 使用while循环输出1 2 3 4 5 6 8 9 10count = 1while count <= 10: if count == 7: count += 1 continue ...

  8. Rower Bo (高数 + 物理)

    #include<bits/stdc++.h> #define esp (1e-5) using namespace std; int main(){ int a; double v1, ...

  9. crm

    CRM 开发 需求分析 存储所有的客户咨询信息 避免重复数据 客户的多次跟踪记录 客户来源.成单率分析 每个销售只能修改自己的客户信息 报名流程开发 班级管理 学员成绩,出勤管理 问卷调查 校区管理 ...

  10. Groovy常用编程知识点简明教程

    概述 Groovy 是一门基于JVM的动态类型语言,可以与 Java 平台几乎无缝融合(与Java代码一样编译成字节码). 使用 Groovy ,可以增强 Java 应用的灵活性和可扩展性,提升开发效 ...