一.管理后台登陆 http://ip:15672/#/
用户名:默认 guest
密码:默认 guest
二.五种工作模式:
简单模式(无交换机)
work(工作队列模式)
routing(路由模式) 交换机type=direct headers
public(发布订阅模式) 交换机type=fanout
topic(通配符模式) 交换机type=topic
rpc
三.优缺点
ActiveMQ
单机吞吐量:万级
topic数量都吞吐量的影响:
时效性:ms级
可用性:高,基于主从架构实现高可用性
消息可靠性:有较低的概率丢失数据
功能支持:MQ领域的功能极其完备
总结:
非常成熟,功能强大,在早些年业内大量的公司以及项目中都有应用
偶尔会有较低概率丢失消息
现在社区以及国内应用都越来越少,官方社区现在对ActiveMQ 5.x维护越来越少,几个月才发布一个版本
主要是基于解耦和异步来用的,较少在大规模吞吐的场景中使用
RabbitMQ
单机吞吐量:万级
topic数量都吞吐量的影响:
时效性:微秒级,延时低是一大特点。
可用性:高,基于主从架构实现高可用性
消息可靠性:
功能支持:基于erlang开发,所以并发能力很强,性能极其好,延时很低
总结:
erlang语言开发,性能极其好,延时很低;
吞吐量到万级,MQ功能比较完备
开源提供的管理界面非常棒,用起来很好用
社区相对比较活跃,几乎每个月都发布几个版本分
在国内一些互联网公司近几年用rabbitmq也比较多一些 但是问题也是显而易见的,RabbitMQ确实吞吐量会低一些,这是因为他做的实现机制比较重。
erlang开发,很难去看懂源码,基本职能依赖于开源社区的快速维护和修复bug。
rabbitmq集群动态扩展会很麻烦,不过这个我觉得还好。其实主要是erlang语言本身带来的问题。很难读源码,很难定制和掌控。
四.应用
1.引入坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.增加配置文件
spring.rabbitmq.host=47.96.21.193
spring.rabbitmq.port=5672
spring.rabbitmq.username=test
spring.rabbitmq.password=qwe123
spring.rabbitmq.virtual-host=/neptune.test
spring.rabbitmq.connection-timeout=20000
3.生产者(交换机,路由,队列都在管理页面创建好了,也可以在配置类中声明)
@Service
public class Send {
private static final String EXCHANGE = "topic.python.exchange";
private static final String ROUTING_KEY = "topic.python.rout.key";
public static final String deepthimage = "deepthimage";
public static final String superimage = "superimage";
public static final String beautifulimage = "beautifulimage";
@Autowired
private AmqpTemplate rabbitTemplate;
public void sindSuperImg(JSONObject mqJson) {
mqJson.put("job_type", superimage);
this.rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY, mqJson.toJSONString());
}
}
4.消费者(交换机,路由,队列都在管理页面创建好了,也可以在配置类中声明)
@Service
public class Recive extends BaseService { @Autowired
private UserSuperImgMapper userSuperImgMapper; private static final String EXCHANGE = "topic.pythoncallback.exchange";
private static final String EXCHANGE_DURABLE = "true";
private static final String QUEUE_NAME = "pythoncallback.queue";
private static final String QUEUE_DURABLE = "true";
private static final String ROUTING_KEY = "topic.pythoncallback.rout.key"; @RabbitListener(bindings = {
@QueueBinding(exchange = @Exchange(type = ExchangeTypes.TOPIC, value = EXCHANGE, durable = EXCHANGE_DURABLE), value = @Queue(value = QUEUE_NAME, durable = QUEUE_DURABLE), key = ROUTING_KEY) })
public void process(String json) {
//处理业务逻辑
}
}