MQ的作用

1.什么是MQ,有什么用?

MQ 是message queue ,消息队列,也叫消息中间件,遵守JMS(java message service)规范的一种软件。(同时还有另一个叫AMQP的应用层协议,语言无关性不受产品 语言等限制,rabbitMQ支持这个 )

是类似于数据库一样需要独立部署在服务器上的一种应用,提供接口给其他系统调用。

使用mq消息队列可用6字概括:解耦、异步、削峰

解耦:将消息写入消息队列,需要消息的时候自己从消息队列中订阅,从而原系统不需要做任何修改。

异步:将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度

削峰:原系统慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。

缺点有以下几个:

系统可用性降低
系统引入的外部依赖越多,越容易挂掉。万一 MQ 挂了,MQ 一挂,整套系统崩溃,你不就完了?

系统复杂度提高
硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?问题一大堆。

一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。

2.常见MQ的类型

activeMQ 对java支持良好,缺点是对其他语言支持不够友好,适合中小企业系统

rabbitMQ 对java支持良好,对其他语言也支持良好,跨平台,语言无关

kaffka 日志消息中间件 支持大数据场景

3.JMS规范

MQ实现参照了jms规范,(规范就是一种约定)

该规范中包括

提供者:实现jms规范的中间件服务器

客户端:发送或者接受消息的应用程序

生产者/发布者:创建并发送消息的客户端

消费者/订阅者:接受并处理消息的客户端

消息:应用程序之间传递的内容

消息模式:在客户端之间传递消息的方式,jms中定义了主题和队列两种模式

主题模式:

假如发布者发布了100条消息,那么如果有n个订阅者,每个订阅者都可以获取到100条消息。即订阅者可以获取到所有的消息(但如果订阅是在主题发布消息之后,则获取不到任何消息,只能获取到订阅时间之后主题的发布的消息,比如说A订阅了B, B发布了消息,C再订阅了B,那么只有a能够获取到消息,C不能,因为它的订阅行为发生在B发布消息之后)

队列模式:

假如生产者发送了100条消息,如果有n个消费者,那么每个订阅者加起来获取到的消息总数是100。

没有时间上限制。只要队列中有消息,消费者可以任意时间去取消息,一个消息只能被一个消费者消费。

4.jms约定的接口

ConnectionFactory 获取与MQ服务连接的工厂类

Connection 与MQ服务的连接, 由ConnectionFactory 创建

Session 会MQ服务的会话 由Connection 创建

MessageProducer 消息生产者,由Session 创建

MessageConsumer 消息消费者 由Session创建

Message 消息,由Session创建

Desination 消息的目的地

5.原生实际代码例子

一.原生mq用法 队列, 创建生产者消费者模式

生产者发送消息


//1.创建connectionFactory 与mq服务器进行连接

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 为该mq的实现 比如activeMQ rabbitMQ等

// url为服务器地址 tcp格式 比如 tcp://xxxx:xxx

//2.创建Connection

Connection connection=connectionFactory.createConnection();

//3.启动连接

connection,start();

//4.创建会话

Session session=connection.createSession(XXX); //xx为该session的创建时候的参数 比如设定事务,模式等等,具体依据不同的实现形式

//5.创建一个目标

Destination destination=session.createQueue(queueName);

//6.创建一个生产者

MessageProducer producer=session.createProducer(destination);

//7.创建消息

TextMessage textMessage=session.createTextMessage(“text”);

//8.发送消息

producer.send(textMessage);

//9.关闭连接

connection.close();


消费者获取消息

//1.创建connectionFactory 与mq服务器进行连接

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 为该mq的实现 比如activeMQ rabbitMQ等

// url为服务器地址 tcp格式 比如 tcp://xxxx:xxx

//2.创建Connection

Connection connection=connectionFactory.createConnection();

//3.启动连接

connection,start();

//4.创建会话

Session session=connection.createSession(XXX); //xx为该session的创建时候的参数 比如设定事务,模式等等,具体依据不同的实现形式

//5.创建一个目标

Destination destination=session.createQueue(queueName);

//6.创建一个消费者

MessageConsumer consumer=session.createConsumer(destination);

//7.创建一个监听器

consumer.setMessageListener(

new MessageListener(){

public void onMessage(Message message){

TextMessage textMessage=(TextMessage)message;

//8.获取消息

textMessage.getText();

}});

//9.关闭连接

connection.close();

二.原生mq用法 主题, 创建发布者 订阅者模式

发布者----

//1.创建connectionFactory 与mq服务器进行连接

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 为该mq的实现 比如activeMQ rabbitMQ等

// url为服务器地址 tcp格式 比如 tcp://xxxx:xxx

//2.创建Connection

Connection connection=connectionFactory.createConnection();

//3.启动连接

connection,start();

//4.创建会话

Session session=connection.createSession(XXX); //xx为该session的创建时候的参数 比如设定事务,模式等等,具体依据不同的实现形式

//5.创建一个目标

Destination destination=session.createTopic(topicName);

//6.创建一个生产者

MessageProducer producer=session.createProducer(destination);

//7.创建消息

TextMessage textMessage=session.createTextMessage(“text”);

//8.发送消息

producer.send(textMessage);

//9.关闭连接

connection.close();

—订阅者

//1.创建connectionFactory 与mq服务器进行连接

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 为该mq的实现 比如activeMQ rabbitMQ等

// url为服务器地址 tcp格式 比如 tcp://xxxx:xxx

//2.创建Connection

Connection connection=connectionFactory.createConnection();

//3.启动连接

connection,start();

//4.创建会话

Session session=connection.createSession(XXX); //xx为该session的创建时候的参数 比如设定事务,模式等等,具体依据不同的实现形式

//5.创建一个目标

Destination destination=session.createTopic(topicName);

//6.创建一个消费者

MessageConsumer consumer=session.createConsumer(destination);

//7.创建一个监听器

consumer.setMessageListener(

new MessageListener(){

public void onMessage(Message message){

TextMessage textMessage=(TextMessage)message;

//8.获取消息

textMessage.getText();

}});

//9.关闭连接

connection.close();

6.spring集成下的代码例子

ConnectionFactory用于管理连接的连接工厂 这个是

spring提供地连接池,spring提供了SingleConnectionFactory和

CachingConnectionFactory

JmsTemplate用于发送和接受消息的模板类,spring提供的 只要注入这个bean,既可以

用jmsTempalate方便的操作jms 不需要像之前那样写一堆重复代码

这个是线程安全的

MessageListerner 消息监听器,实现了一个onMessage方法,该方法只接收一个Message参数

发送消息的方法

@Autowired

JmsTemplate jmsTemplate;

@Autowired

Destination destination;

jmsTemplate.send(destination,new MessgaeCreator(){

public Message createMessage(Session session) {

TextMessage textMessage=session.createTextMessage(“message”);

return textMessage;

}});

JmsTemplate实际上就是做了一层封装而已 简化了用法 ,可以参考里面的源代码

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值