何为消息:
- 服务器间的业务请求
- 原始架构:
- 服务器中的A功能需要调用B、C模块才能完成,这些都是耦合模块,一个模块出问题或模块之间连接坏掉,则整体坏掉
- 微服务架构:
- 服务器A向服务器B发送要执行的操作(视为消息)
- 服务器A向服务器C发送要执行的操作(视为消息)
- 原始架构:
MQ作用
优势:
- 1.应用解耦(提高系统可维护性,容错性)
- 2.异步提速(微服务集群环境下,每个服务都在并行做自己的事,执行时间互不影响,提升用户体验和系统吞吐量)
- 3.削峰填谷(提高系统稳定性,把短时间内暴增的数据,在一段时间内平摊发送,使数据平缓流动,不会造成短时间内数据暴增,给机器带来压力的现象)
劣势:
- 系统可用性降低:系统引入外部依赖越多,当然稳定性越差,万一mq宕机了呢?
- 系统复杂度提高:重复消费?消息丢失?如何保证消息传递的有序性?
- 一致性问题:类似事务的原子性,多个消费者之间,处理消息有的成功有的失败咋办?
运行机制:
基础概念
- 生产者
- 消费者
- 消息服务器
- 命名服务器
- 消息(实质为实体类)
- 主题
- 标签
- 心跳
- 监听器
- 拉取消费、推动消费
- 注册
环境搭建及安装略
简单生产消费案例:
生产者:
冷知识:接口可以new,只要实现了它的方法就行了哦!!!
//发送消息
//缺啥补啥
//作业1 string byte[] char[] 相互转换
public class Producer {
public static void main(String[] args) throws Exception {
//1. 谁来发?
DefaultMQProducer producer = new DefaultMQProducer("group1");
//2. 设定发送的命名服务器地址
producer.setNamesrvAddr("localhost:9876");
// 3.1启动发送的服务
producer.start();
//3. 怎么发?
//4. 创建要发送的消息对象,指定topic,指定内容body
String msg="hello world ";
Message message = new Message("topic1", "tag1", msg.getBytes());
SendResult sendResult = producer.send(message);
//5. 发的结果是什么?
System.out.println(sendResult);
//6. 打扫战场
producer.shutdown();
}
}
消费者:
//消费者
//缺啥补啥
//作业2 能不能new 接口? 可以!!!只要实现了该接口的方法就能new
public class Consumer {
public static void main(String[] args) throws Exception {
//1. 谁来收?推送模式的消费者,拉取模式太耗资源
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
//2. 从哪里收消息?
consumer.setNamesrvAddr("localhost:9876");
//3. 监听哪个消息队列。对应消费者的消息队列
consumer.subscribe("topic1","*");
//4. 处理业务流程 注册监听器
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
//写我们的业务逻辑
for (MessageExt msg : msgs) {
System.out.println(msg);
byte[] body = msg.getBody();
System.out.println(new String(body));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
System.out.println("消费者起来了");
//千万别关消费者
}
}