作为自己熟悉几种常用mq中间件的过程记录 持续更新
rabbitmq
安装部分
2019.1.24
docker pull rabbitmq:management
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 镜像id
netstat -atnlp查看端口占用
跑起来rabbitmq后日志正常无问题 但访问15672 无返回值,搜了俩小时资料 换了各种包也不好用,明天问问老大吧,初步怀疑可能是防火墙/端口未开放的事,但搜了开放端口的各种命令也不好用。。先看看activemq吧
2019.1.25
继续rabbitmq 先装好再说吧。。
今天学到了查看端口占用情况的命令
netstat -tunlp
netstat -tunlp|grep 15672
sudo yum install lsof
y
lsof -i :15672
端口也监听上了 15672的state也是listen了
问了微信群 认为的大致问题为
1.映射的端口不对
2.没有暴露到外部
3.镜像使用错误(没有management,不带managementg-plugin)
4.启动后 附加management命令才启动界面
但上面的4个问题要么能自己确认没有问题,要不就是不会,不知道怎么排查。但群友提出了docker hub上的截图,决定去看看
docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 8080:15672 rabbitmq:3-management
搞定,打开ip:8080可以访问,但公司测试环境映射是15672,则也同样可以访问 等于端口这方面还是没有解决问题。先留个坑吧,需要学的东西太多先不研究这个了。猜测可能1.与之前docker起的rabbit是没web管理界面的 有什么冲突吧。2.或者还是端口没开启明白
整合部分br/>pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.properties
#rabbitmq地址
spring.rabbitmq.host=ip
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
@Resource
AmqpTemplate amqpTemplate;br/>@Resource
RabbitTemplate amqpTemplate;
整合时可能会遇到的问题
AmqpIOException: java.io.IOException
新添加了用户 需要在web管理端 点击对应用户名字 在点击Set permission
实战部分
0.rabbitmq 实战部分会写一写rabbitmq 6种模式的demo 理解一下每种模式的区别
https://www.rabbitmq.com/getstarted.html 哪6种?参考官方文档
1.如果消费者抛出异常,那么生产者会一直发送消息,这是在配置文件的一个属性
1.1 关于消费确认(消费者是抛异常后是否标记这条消息为完成状态之类的):https://blog.csdn.net/lxhjh/article/details/69054342
2.一个发送者,N个接受者,经过测试会均匀的将消息发送到N个接收者中
3.n个发送者,n个接受者 仍然会均匀的将消息发送到N个接收者中
4.AmqpException: No method found for class com.example.demo.entity.User 接受类型错误
5.springboot以及完美的支持对象的发送和接收,不需要格外的配置。(生产者消费者数据类型随意,但要一致)
6.发现一个小tips,除简单模式外在队列的配置文件中声明的exchange的数据类型,代表了使用了那种模式
7.消息持久化:保证消息不消失,声明queue的时候:return new Queue("hello",true);
8.如果routingkey没有绑定的q 则 消息消失,如果有绑定的q但没有q的监听器则消息阻塞在q里
一 helloworld/Direct Exchange简单模式
Direct Exchange是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列。
direct 类型的行为是"先匹配, 再投送". 即在绑定时设定一个 routing_key, 消息的routing_key 匹配时, 才会被交换器投送到绑定的队列中去.
单个生产者多个消费者 均匀分布到各个消费者中
使用简单模式 无需定义交换机,是用了默认的 还是不需要?
通过观察web端的可视化界面查看,结果 :使用默认的交换机
amqpTemplate.convertAndSend("hello",new User("hcb",i));
一 topic Exchange
TopicExchange exchange()
将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.” 只会匹配到“audit.irs”。消费者各自监控自己的队列;交换机通过一种模式策略确定生产者的消息放入那个队列。
自己一开始的理解:一个生产者多个消费者,消费者们 使用的q不相同,routingkey也不相同那么 只使用q不就可以了吗? 为什么还要有routingkey?确实这样。但有一个前提就是生产者知晓每一个q。
和同事套路后的理解:
消费者配置
BindingBuilder.bind(queuemessages).to(topicExchange).with("topic.#");这句话的意思是把q和routingkey绑定。
生产者
rabbitTemplate.convertAndSend(PayContract.RABBIT_PAY_SUCCESS_NOTIFY_EXCHANGE, orderEntity.getAppId(), data.toJSONString().getBytes());
生产者只通知了routingkey,没有实际的q,结合上面的图一下就想明白了。进入交换机exchange会根据不同的routingkey去寻找绑定的队列q,进入队列。
实际例子:消费完成后根据appid去通知不同的游戏服务端。
一 Fanout Exchange广播模式或者订阅模式
FanoutExchange fanoutExchange()
不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。 给Fanout交换机发送消息,绑定了这个交换机的所有队列都收到这个消息。
定义一个FanoutExchange类型交换机,再让三个队列q都绑定到这个交换机。因为FanoutExchange类型的交换机,routingKey不起作用,它向所有的队列发送广播,只要队列绑定到该交换机即接受消息。
1如果不写第二个参数routingkey会怎么样
amqpTemplate.convertAndSend("fanoutExchange", "topic.messages", context1);
则会变成简单模式 (routingkey模式)
2.刚刚写了demo,rabbit的配置文件定义了多个q并且绑定到fanoutexchange交换机上,但并没有对应的消费者,会造成队列阻塞,重新修改demo,增加了对应的消费者。完成。。好吧 这其实不算什么知识点。
3.routingkey写什么 交换机下所有队列都会接到
4.如果监听的队列没有(queue不存在),报错
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'fanout.D' in vhost '/', class-id=50, method-id=10)
5.如果其中一个队列抛出异常 则 依旧会重复推送消息
6.一个q绑定多个routingkey 可以
return BindingBuilder.bind(queuemessages).to(topicExchange).with("topic.messages");
return BindingBuilder.bind(queuemessages).to(topicExchange).with("topic.messagess");
一 Work queues 工作模式
其实就是多生产/多消费版本的简单模式
一 Routing 模式
DirectExchange directExchange()
需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “test”,则只有被标记为“test”的消息才被转发,不会转发test.aaa,也不会转发dog.123,只会转发test。
使用起来的操作方法和topic唯一区别就是在消息队列配置类里 exchange是DirectExchange这个类型,
ok操作方法没什么,但和topic区别是什么呢
topic可以设置routingkey为user.# (user.a/user.b),Routing不可以 使用起来貌似仅此而已
理论部分
首先确定一点 rabbitmq 共有6种模式
官方文档https://www.rabbitmq.com/getstarted.html
几个不错的文章
https://www.cnblogs.com/ityouknow/p/6120544.html
https://blog.csdn.net/qq_33040219/article/details/82383127
https://www.jianshu.com/p/80eefec808e5
https://blog.csdn.net/rickiyeat/article/details/70991021
activemq
安装部分
2019.1.24
docker pull docker.io/webcenter/activemq
docker run -d --name myactivemq -p 61617:61616 -p 8162:8161 3af156432993
61616是activemq的容器使用端口(映射为61617),8161是web页面管理端口(对外映射为8162)
http://ip:8162/ 草 居然没问题,不知道为什么rabbit除了问题 崩溃
点击manage activemq broker就可以进入管理页面(需要输入账号密码)。
默认账号密码都是admin
整合部分
实战部分
理论部分
rocketmq
安装部分
命令启动
跟着视频教程从官网下载了压缩包 .zip
yum install -y unzip zip;
tar –xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2 //解压 tar.bz2
tar –xZvf file.tar.Z //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip
1、.tar 用 tar –xvf 解压
2、.gz 用 gzip -d或者gunzip 解压
3、.tar.gz和.tgz 用 tar –xzf 解压
4、.bz2 用 bzip2 -d或者用bunzip2 解压
5、.tar.bz2用tar –xjf 解压
6、.Z 用 uncompress 解压
7、.tar.Z 用tar –xZf 解压
8、.rar 用 unrar e解压
9、.zip 用 unzip 解压
但在cd rocketmq-console目录下打包的时候报错
好吧 又搁置了。
整合部分
实战部分
理论部分
zeromq
安装部分
整合部分
实战部分
理论部分
kafka
安装部分
kafka看网上说要和zookper一起使用 zookper还没学习 没空看细节,先搁置
整合部分
实战部分
理论部分
来源:51CTO
作者:林博轩
链接:https://blog.51cto.com/12005608/2346336