rabbit mq的一个实例,异步功能
简单的使用场景:消息队列的场景有:解耦,异步,削峰。
此例用的场景,异步
有时候会有请求消耗时间过长,不能老让用户等待返回结果,可以用消息队列来做异步实现,之前用过workmain等类似的异步,但不如rabbit强大,
一个实际场景:
我们做的一个抢任务功能,成功或失败会有一个日志记录,这个功能没必要实时返回,可以使用异步,
框架tp5,一个任务执行程序consumer,多个任务发布入口producer,用定时任务监控consumer是否挂掉,挂掉则重新启动,并记录日志挂掉的原因(有时候会数据库连接失败。。)
producer的代码:
//存储任务$data 字符串
	function savetask($data){
//作为任务发布者,
		$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
		$channel = $connection->channel();
		 
		$channel->queue_declare('task_queue_log', false, true, false, false);
		//$data = "work1";
		$data = json_encode($data); 
		$msg = new AMQPMessage($data,
				array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)
		);
		 
		$channel->basic_publish($msg, '', 'task_queue_log');
		 
		//echo " [x] Sent ", $data, "\n";
		 
		$channel->close();
		$connection->close();
	}
consumer的代码
//执行任务
	function runwork(){
//作为worker执行任务
		$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
		$channel = $connection->channel();
		 
		$channel->queue_declare('task_queue_log', false, true, false, false);
		 
		echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
		 
		$callback = function($msg){
    		$this->dowork($msg);
    		//$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    	};
		$channel->basic_qos(null, 1, null);
		$channel->basic_consume('task_queue_log', '', false, false, false, false, $callback);
		 
		while(count($channel->callbacks)) {
			$channel->wait();
		}
		 
		$channel->close();
		$connection->close();
	}
回调函数,操作具体任务,比如根据不同的类型执行不同的函数,存储日志
	function dowork($msg){
			echo " [x] Received ", $msg->body, "\n";
			//sleep(substr_count($msg->body, '.'));
			//处理程序
			$data = json_decode($msg->body,true);
			switch ($data['type']){
				case 'union_repeat':
					$this->union_repeat($data['data']);
					break;
				case 'union_active':
					$this->union_active($data);
					break;
				case 'union_click':
					$this->union_click($data);
					break;
				case 'task_active':
					$this->task_active($data);
					break;
				case 'task_click':
					$this->task_click($data);
					break;
				case 'task_repeat':
					$this->task_repeat($data);
					break;
				
			}
			
			echo " [x] Done", "\n";
			$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
		
	}
consumer的执行保证
用shell检查进程是否存在,不存在则开启
#!/bin/sh
ps -fe|grep runrabbitmqc |grep -v grep
if [ $? -ne 0 ]
then
sh /home/wwwroot/server/runrabbit.sh
else
echo "run....."
fi
runrabbit.sh的代码:
#!/bin/bash
cd /home/wwwroot/server
php think runrabbitmqc
任务发布入口producer主要功能就是将需要记录的日志发布到消息队列,而消费者接受到消息则执行存储日志到数据库
rabbit mq的一个实例,异步功能的更多相关文章
- Rabbit MQ 面试题相关
		项目中的MQ: #rabbitmq spring.rabbitmq.host=127.0.0.1 主机 spring.rabbitmq.port=5672 端口 spring.rabbitmq.use ... 
- 学习MQ(三) 一个实例
		学习MQ(三) 一个实例. 现在有两台机器A和B,分别安装了MQ6.0,我要通过MQ进行A和B之间的双向通信. 我打算分两步,第一步:实现A到B的数据传输. 在A上: 1.创建队列管理器 QM_100 ... 
- celery rabbit mq 详解
		Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ... 
- rabbit MQ 消息队列
		为什么会需要消息队列(MQ)? 一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ... 
- 在 Windows 上安装Rabbit MQ 指南
		rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ... 
- (转)在 Windows 上安装Rabbit MQ 指南
		rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ... 
- celery+Rabbit MQ实战记录
		基于以前的一篇文章,celery+Rabbit MQ的安装和使用, 本文更加详细的介绍如何安装和使用celey, Rabbit MQ. 并记录在使用celery时遇到的一些问题. 1.安装 Rabbi ... 
- Rabbit MQ 入门指南
		rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ... 
- Spring Boot:使用Rabbit MQ消息队列
		综合概述 消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程则可以 ... 
随机推荐
- FastAPI 学习之路(三十四)数据库多表操作
			之前我们分享的是基于单个的数据库表的操作,我们在设计数据库的时候也设计了跨表,我们可以看下数据库的设计. class User(Base): __tablename__ = "users&q ... 
- 状压dp学习笔记(紫例题集)
			P3451旅游景点 Tourist Attractions 这个代码其实不算是正规题解的(因为我蒟蒻)是在我们的hzoj上内存限制324MIB情况下过掉的,而且经过研究感觉不太能用滚动数组,所以那这个 ... 
- Photoshop教程,视频MP4格式转换为GIF格式
			转自百度问题 https://zhidao.baidu.com/question/1497485136643778259.html Adobe PhotoShop软件的最bai新du本是可以编辑视zh ... 
- 洛谷 P2680 [NOIP2015 提高组] 运输计划
			链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ... 
- 连续子序列的最大和 牛客网 剑指Offer
			连续子序列的最大和 牛客网 剑指Offer 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量 ... 
- cf17A Noldbach problem(额,,,素数,,,)
			题意: 判断从[2,N]中是否有超过[包括]K个数满足:等于一加两个相邻的素数. 思路: 枚举. 也可以:筛完素数,枚举素数,直到相邻素数和超过N.统计个数 代码: int n,k; int prim ... 
- HTML bootstrap 模态对话框添加用户
			HTML 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> ... 
- zabbix 报警发送qq邮件
			1.开启QQ邮箱的IMAP/SMTP服务,获取授权码 获取授权码:点击[开启]按钮,编辑短信发送,即可获得授权码 2.配置 /etc/mail.rc 添加下列配置: [ set from=XXX@qq ... 
- Python正则表达式使用小记
			最近做Python课实验发现正则表达式和它在py中的的标准库re有很多能多琢磨一下的点,遂决定写成一篇小记,以后想复习能再来看看. 名词 因为不同文献书籍对正则表达式的描述有差别,我在这里列出一下我已 ... 
- Linux下的 sniff-andthen-spoof程序编写
			Linux下的 sniff-andthen-spoof程序编写 一.任务描述 在本任务中,您将结合嗅探和欺骗技术来实现以下嗅探然后欺骗程序.你需要两台机器在同一个局域网.从机器A ping IP_X, ... 
