一、内容安排
二、传统Http协议调用接口存在的缺陷
1.http
1.http基于请求与响应。
2.同步过 程
时间 >=9s
1.耗时
2. 用同步 ,不解耦
高并发下,频繁创建thread
自己要写补偿机制
重试:会存在幂等性问题
总结
三、为什么要使用消息中间件
四、消息中间件异步、流量削峰、解耦问题
五、市面主流消息中间件对比分析
市面主流的MQ对比分析
ActiveMQ
历史悠久的开源项目,是Apache下的一个子项目。已经在很多产品中得到应用,实现了JMS1.1规范,可以和spring-jms轻松融合,实现了多种协议,不够轻巧(源代码比RocketMQ多),支持持久化到数据库,对队列数较多的情况支持不好
。
RabbitMQ
结合erlang语言本身的并发优势,支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。
RocketMQ
阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq。同时将阿里系内部多款mq产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,目前主要多用于订单交易系统。
Kafka
Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性:高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;高堆积:支持topic下消费者较长时间离线,消息堆积量大;
六、windows版本安装Rabbitmq
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),RabbitMQ服务器是用Erlang语言编写的。
RabitMQ官方网站:
https://www.rabbitmq.com/
RabitMQ环境的基本安装
1.下载并安装erlang,下载地址:http://www.erlang.org/download
2.配置erlang环境变量信息
新增环境变量ERLANG_HOME=erlang的安装地址
将%ERLANG_HOME%\bin加入到path中
3.下载并安装RabbitMQ,下载地址:http://www.rabbitmq.com/download.html
注意: RabbitMQ 它依赖于Erlang,需要先安装Erlang。
出现此窗口 启动成功:
七、rabbitmq管理平台端口号介绍
RabbitMQ 管理平台地址 http://127.0.0.1:15672
默认账号:guest/guest 用户可以自己创建新的账号
八、VirtualHosts的核心作用
Virtual Hosts:
像mysql有数据库的概念并且可以指定用户对库和表等操作的权限。那RabbitMQ呢?
RabbitMQ也有类似的权限管理。在RabbitMQ中可以虚拟消息服务器VirtualHost,每
个VirtualHost相当月一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互
隔离的。exchange、queue、message不能互通。
九、rabbitmq创建Virtual Hosts
重新创建
10.第十节-简单工作队列之生产者投递消息.ev4
依赖:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5 </version>
</dependency>
public class RabitMQConnection {
public static Connection getConnection() throws IOException, TimeoutException {
// 1.创建我们的连接
ConnectionFactory connectionFactory = new ConnectionFactory();
// 2.设置我们的连接地址
connectionFactory.setHost("127.0.0.1");
// 3.设置我们的端口号
connectionFactory.setPort(5672);
// 4.设置账号和密码
connectionFactory.setUsername("meite");
connectionFactory.setPassword("meite");
// 5.设置VirtualHost
connectionFactory.setVirtualHost("/meite_rabbitmq");
return connectionFactory.newConnection();
}
}
public class Producer {
private static final String QUEUE_NAME = "mayikt";
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("生产者启动成功..");
// 1.创建我们的连接
Connection connection = RabitMQConnection.getConnection();
// 2.创建我们通道
Channel channel = connection.createChannel();
for (int i = 0; i < 10; i++) {
String msg = "突破3万月薪" + i;
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
System.out.println("生产者发送消息成功:" + msg);
}
channel.close();
connection.close();
}
}
public class Consumer {
private static final String QUEUE_NAME = "mayikt";
public static void main(String[] args) throws IOException, TimeoutException {
// 1.创建我们的连接
Connection connection = RabitMQConnection.getConnection();
// 2.创建我们通道
Channel channel = connection.createChannel();
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("消费消息msg:" + msg);
}
};
// 3.创建我们的监听的消息
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
}
}
生产者投递的消息,还未被 消费者消费的 条数
可被lambda优化
十一、简单工作队列之消费者投递消息
点对点
1、一个生产者 一个消费者。
2、一个生产者 两个消费者时:
会轮训均摊
生产者产生10条消息 。
两个消费者 各自消费5条