laravel框架的rabbitmq使用示例[多队列封装]
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
消息队列工作示意图
生产者P--[发布消息]--> 交换机X--[根据路由绑定分发]-->队列<--[订阅消息]--消费者C
关系
1 生产者和交换机
创建消息,并且发送到对应的交换机,发送的时候可以带上特定的routeKey
2 交换机和队列
队列 绑定到 交换机 (可以设置路由 routeKey direct 和 topic 模式下 有效,广播模式只要绑定就分发到队列)
假如交换机上的消息分发不到队列,则此消息就自动删除了
a 直连交换机(Direct exchange)
交换机 --[所有绑定在自己上的队列中找出设置和消息routeKey一样的]--> 队列 ,根据绑定的routeKey 来找队列 分发消息
b 广播交换机 (Fanout Exchange)
交换机 --[所有绑定在自己上的]--> 队列, 只要队列绑定到交换机 队列分发消息
c 主题交换机 (Topic Exchange)
交换机 ---[所有绑定在自己上的队列中找出 消息routeKey 满足队列匹配的]--> 队列, routeKey 满足匹配要求的队列就会分发消息.
3 队列和消费者
消费者绑定到对应的队列就能得到队列中的消息, 假如多位消费者同事消费一个队列 可以通过 prefetchCount 来设置 最多同时消费个数, 握手后再发送新的消息过来
示例代码说明
消息队列虽然是持久化,可以通过握手机制来实现是否正真消费。示例代码中采用了默认握手,通过数据库记录中存放对应执行记录来实现队列的执行情况监控。
1 rabbitmq操作
新建demo 账号
rabbitmqctl add_user demo 181219
新建demo 虚拟主机
rabbitmqctl add_vhost demo
设置 demo 账号在 demo 虚拟主机 权限
rabbitmqctl set_permissions -p demo demo ".*" ".*" ".*"
web界面插件开启
rabbitmq-plugins enable rabbitmq_management
设置demo 账号 角色
rabbitmqctl set_user_tags demo administrator
2 数据库表
表一共2张 一张记录消息内容以及执行情况, 另一张记录执行失败的错误信息
CREATE TABLE `mq_process_error_log` (
`id` bigint() unsigned NOT NULL AUTO_INCREMENT,
`msg_id` bigint() NOT NULL,
`process_msg` varchar() NOT NULL DEFAULT '' COMMENT '执行返回信息',
`create_time` int() NOT NULL DEFAULT '' COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_msg_id` (`msg_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='消息处理失败日志表'; -- ----------------------------
-- Table structure for mq_process_log
-- ----------------------------
CREATE TABLE `mq_process_log` (
`id` bigint() unsigned NOT NULL AUTO_INCREMENT,
`msg_str` varchar() NOT NULL DEFAULT '' COMMENT '消息请求内容 json字符串',
`msg_type` tinyint() NOT NULL DEFAULT '' COMMENT '消息类型',
`find_keyword` varchar() NOT NULL DEFAULT '' COMMENT '查找消息内容的关键字',
`create_time` int() NOT NULL DEFAULT '' COMMENT '创建时间',
`process_num` tinyint() NOT NULL DEFAULT '' COMMENT '执行次数',
`process_start_time` int() NOT NULL DEFAULT '' COMMENT '执行开始时间',
`process_end_time` int() NOT NULL DEFAULT '' COMMENT '执行结束时间',
`process_status` tinyint() NOT NULL DEFAULT '' COMMENT '执行状态 0 未执行 1 成功 2 失败',
`process_msg` varchar() NOT NULL DEFAULT '' COMMENT '执行返回信息',
PRIMARY KEY (`id`),
KEY `idx_find_keyword` (`find_keyword`) USING BTREE,
KEY `idx_msg_type` (`msg_type`) USING BTREE,
KEY `idx_process_status` (`process_status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='消息处理日志表';
3 代码说明
创建3个队列来处理不同的消息, 来满足不同优先级消息处理
发送消息,以及处理消息监听,重发消息都有封装
代码中已经创建了抽象父类,不同的vhost配置只需要继承父类即可, 如下代码
/**
* demo-rabbitMq类
* Class DemoRabbitMq
* @package App\Service\Amqp
* @author zxqc2018
*/
class DemoRabbitMq extends AbstractRabbitMq
{
use Singleton;
//mq配置
protected $configName = 'demo';
//默认交换机
protected $defaultExchangeName = 'demo-exchange';
//快中慢-队列配置
protected $queuePriorityConfig = [
'fast' => ['demo-fast-queue', 'demo.fast.#'],
'middle' => ['demo-middle-queue', 'demo.middle.#'],
'slow' => ['demo-slow-queue', 'demo.slow.#'],
]; /**
* 设置routeKey对应处理方法
* @author zxqc2018
*/
function settingRouteKeyProcessFunc()
{
$this->routeKeyProcessFunc[self::DEMO_FAST_TEST] = function ($msgData) {
print_r($msgData);
$res = \resultData();
$res->setMessage('fast');
return $res;
};
$this->routeKeyProcessFunc[self::DEMO_SLOW_TEST] = function ($msgData) {
print_r($msgData);
if (rand(1,10) > 5) {
return resultData([], ErrorCode::ERROR_RABBIT_MQ, '测试处理失败');
}
$res = \resultData();
$res->setMessage('slow');
return $res;
};
}
}
代码地址:
https://gitee.com/zxqc2014/laravel_rabbitmq_demo
laravel框架的rabbitmq使用示例[多队列封装]的更多相关文章
- Laravel框架安装RabbitMQ消息中间件步骤
Laravel5.6 整合 RabbitMQ 消息队列 简介: Laravel 队列为不同的后台队列服务提供了统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关 ...
- Laravel框架定时任务2种实现方式示例
本文实例讲述了Laravel框架定时任务2种实现方式.分享给大家供大家参考,具体如下: 第一种 1.生成一个commands文件 > php artisan make:command test ...
- 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议
前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比.详细介绍 RabbitMQ 在 ...
- laravel 框架配置404等异常页面的方法详解(代码示例)
本篇文章给大家带来的内容是关于laravel 框架配置404等异常页面的方法详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在Laravel中所有的异常都由Handl ...
- 在laravel框架中使用mq
本文写于2018-11-28 1.部署laravel项目 https://github.com/laravel/laravel 通过git克隆项目,或者下载zip包然后解压等方式都可以把larave ...
- [php]laravel框架容器管理的一些要点
本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...
- [麦先生]初学Laravel框架与ThinkPHP框架的不同(2)
在经过了一段时间的开发后,我对Laravel框架的认识又在逐步的加深,对于这个世界占有量NO.1的框架... 我想说,我已经在逐步的感受到他的恐怖之处... 一.建表--Laravel在数据库建表上 ...
- enode框架step by step之消息队列的设计思路
enode框架step by step之消息队列的设计思路 enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by ste ...
- 【框架学习与探究之消息队列--EasyNetQ(2)】
声明 本文欢迎转载,系博主原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7654902.html 前言 此文章,是承接上篇:[框架学习与探究之消息队列--Ea ...
随机推荐
- .Net 项目代码风格规范
最近没啥时间自己状态也不是很好,公司的事情忙,自己也有一些事情要处理,所以好久没有写博客了.利用公司午休时间写一写,以下是参考了一些资料,整理出来,共勉之. 代码风格没有正确与否,重要的是整齐划一,清 ...
- 父级(display:none)隐藏时,子节点的高度获取。
当父节点display:none的时候,子节点的高度是0获取不到. 解决办法:用visibility替换display就可以了.
- Day 3 Python 基础数据类型二
1. INT 型 #1. 数字int #bit_length() 当十进制用二进制表示时,最少使用的位数. v =11 data = v.bit_length() print(data) 2. 布尔值 ...
- kali linux之edb--CrossFire缓冲区溢出
漏洞的罪恶根源------变量,数据与代码边界不清,开发人员对用户输入没做过滤,或者过滤不严 如这个脚本,写什么,显示什么,但是加上:,|,&&,后面加上系统命令,就执行命令了 缓冲区 ...
- bzoj1070【SCOI2007】修车(费用流)
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- Flink应用场景
本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...
- 《Andrew Ng深度学习》笔记2
神经网络基础 1.图计算 计算时有两种方法:正向传播和反向传播.正向传播是从底层到顶层的计算过程,逐步推出所求公式.反向传播是从顶层到底层,从已知的式子求出因变量的影响关系. 在这里用到的反向传播算法 ...
- linux系统下的日志,此日志对于系统安全来说是非常重要的一 个机制!!
var/log/messages /etc/logrotate.conf 日志切割配置文件 (参考https://my.oschina.net/u/2000675/blog/908189) dmesg ...
- EA添加时序图
在项目浏览器的空白处右击 http://blog.csdn.net/craftsman1970/article/details/70877530 不同于大部分面向对象或者UML的书籍,在讨论完类图/对 ...
- 用python脚本 从xls文件中读取数据
导入 xlrd 第三方模块 import xlrd data = xlrd.open_workbook('test.xlsx') # 打开xls文件 table = data.sheets()[0] ...