初探RabbitMQ消息队列
SpringBoot
是为了简化Spring
应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程
MQ全称(Message Queue)
又名消息队列,是一种异步通讯的中间件。可以将它理解成邮局,发送者将消息传递到邮局,然后由邮局帮我们发送给具体的消息接收者(消费者),具体发送过程与时间我们无需关心,它也不会干扰我进行其它事情。常见的MQ有kafka
、activemq
、zeromq
、rabbitmq
等等,各大MQ的对比和优劣势可以自行Google
rabbitmq
RabbitMQ
是一个遵循AMQP协议,由面向高并发的erlanng
语言开发而成,用在实时的对可靠性要求比较高的消息传递上,支持多种语言客户端。支持延迟队列(这是一个非常有用的功能)
….
基础概念
Broker:
简单来说就是消息队列服务器实体Exchange:
消息交换机,它指定消息按什么规则,路由到哪个队列Queue:
消息队列载体,每个消息都会被投入到一个或多个队列Binding:
绑定,它的作用就是把exchange
和queue
按照路由规则绑定起来Routing Key:
路由关键字,exchange
根据这个关键字进行消息投递vhost:
虚拟主机,一个broker
里可以开设多个vhost
,用作不同用户的权限分离producer:
消息生产者,就是投递消息的程序consumer:
消息消费者,就是接受消息的程序channel:
消息通道,在客户端的每个连接里,可建立多个channel
,每个channel
代表一个会话任务
基于Centos7.x
安装请参考: http://blog.battcn.com/2017/08/20/linux/linux-centos7-ribbitmq/
常见应用场景
- 邮箱发送:用户注册后投递消息到
rabbitmq
中,由消息的消费方异步的发送邮件,提升系统响应速度 - 流量削峰:一般在秒杀活动中应用广泛,秒杀会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。用于控制活动人数,将超过此一定阀值的订单直接丢弃。缓解短时间的高流量压垮应用。
- 订单超时:利用
rabbitmq
的延迟队列,可以很简单的实现订单超时
的功能,比如用户在下单后30分钟未支付取消订单 - 还有更多应用场景就不一一列举了…..
导入依赖
在 pom.xml
中添加 spring-boot-starter-amqp
的依赖
1 |
<dependencies> |
属性配置
在 application.properties
文件中配置rabbitmq
相关内容,值得注意的是这里配置了手动ACK的开关
1 |
spring.rabbitmq.username=battcn |
具体编码
定义队列
如果手动创建过或者RabbitMQ
中已经存在该队列那么也可以省略下述代码…
1 |
package com.battcn.config; import org.springframework.amqp.core.Queue; |
实体类
创建一个Book
类
1 |
public class Book implements java.io.Serializable { private static final long serialVersionUID = -2164058270260403154L; private String id; |
控制器
编写一个Controller
类,用于消息发送工作
1 |
package com.battcn.controller; import com.battcn.config.RabbitConfig; |
消息消费者
默认情况下 spring-boot-data-amqp
是自动ACK
机制,就意味着 MQ 会在消息消费完毕后自动帮我们去ACK,这样依赖就存在这样一个问题:如果报错了,消息不会丢失,会无限循环消费,很容易就吧磁盘空间耗完,虽然可以配置消费的次数但这种做法也有失优雅。目前比较推荐的就是我们手动ACK
然后将消费错误的消息转移到其它的消息队列中,做补偿处理
1 |
package com.battcn.handler; import com.battcn.config.RabbitConfig; |
主函数
1 |
package com.battcn; import org.springframework.boot.SpringApplication; |
测试
完成准备事项后,启动Chapter11Application
访问 http://localhost:8080/books 将会看到如下内容,就代表一切正常….
1 |
2018-05-22 19:04:26.708 INFO 23752 --- [cTaskExecutor-1] com.battcn.handler.BookHandler : [listenerAutoAck 监听的消息] - [com.battcn.entity.Book@77d8be18] |
初探RabbitMQ消息队列的更多相关文章
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...
- RabbitMQ消息队列1: Detailed Introduction 详细介绍
1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...
- (转)RabbitMQ消息队列(九):Publisher的消息确认机制
在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...
- (转)RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)
在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...
- (转)RabbitMQ消息队列(六):使用主题进行消息分发
在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...
- (转)RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...
- RabbitMQ消息队列应用
RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...
- RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...
- RabbitMQ消息队列(九):Publisher的消息确认机制
在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...
随机推荐
- Java实现蓝桥杯算法提高P0102
算法提高 P0102 时间限制:1.0s 内存限制:256.0MB 提交此题 用户输入三个字符,每个字符取值范围是0-9,A-F.然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制,十进 ...
- Java实现 LeetCode 477 汉明距离总和
477. 汉明距离总和 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进 ...
- Java实现 蓝桥杯VIP 基础练习 完美的代价
package 蓝桥杯VIP; import java.util.Scanner; public class 完美的代价 { public static int sum = 0; public sta ...
- Java实现 蓝桥杯 一步之遥
一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面前是两个按钮,分别写着"F"和"B". 小明突然记起来,这两个 ...
- Java实现第八届蓝桥杯纸牌三角形
纸牌三角形 题目描述 A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算).要求每个边的和相等. 下图就是一种排法(如有对齐问题,参看p1.png). A 9 6 4 8 3 ...
- 数据结构:用实例分析ArrayList与LinkedList的读写性能
目录 背景 ArrayList LinkedList 实例分析 1.增加数据 2.插入数据 3.遍历数据 3.1.LinkedList遍历改进 总结 背景 ArrayList与LinkedList是J ...
- (十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析
一.测试前分析 前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析> 通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程 ...
- MySQL进阶篇(02):索引体系划分,B-Tree结构说明
本文源码:GitHub·点这里 || GitEE·点这里 一.索引简介 1.基本概念 首先要明确索引是什么:索引是一种数据结构,数据结构是计算机存储.组织数据的方式,是指相互之间存在一种或多种特定关系 ...
- git clone 时注意点
环境: 在公司访问外网需要设置代理,另外,在公司局域网内架设了一台 GIT 服务器. 在使用 git clone 时,不能设置成 git 使用代理: git config --global http. ...
- Spark GraphX企业运用
========== Spark GraphX 概述 ==========1.Spark GraphX是什么? (1)Spark GraphX 是 Spark 的一个模块,主要用于进行以图为核心的计 ...