分类归档

Docker教程

FWQ
Docker教程
RabbitMQ的PHP教程之入门 (一)
从网上也看了一些关于RabbitMQ的翻译版的教程,觉得有点啰嗦了。所以基于官方 http://www.rabbitmq.com/tutorials/tutorial-one-php.html做一个简单的备注说明,同时也是本人对学习RabbitMQ的一个总结。本人是从事PHP开发的,所以教程中的代码,都是使用PHP来实现,同时丢弃官网使用composer中的AMQPLIB,因为这个AMQPLIB对一些方法进行了封装,不只直观,所以本人使用原生的类、方法进行备注说明,这样更易于理解过程。   安装Rabbit参考:RabbitMQ的安装 安装Rabbit PHP扩展参考:PHP安装 AMQP扩展 PHP中的AMQP类的使用方法参考:PHP中的AMQP类 这6个教程的学习前提,你需要先了解 RabbitMQ AMQP 消息模型攻略 学习RabbitMQ必需要知道,以下几个知识点,也是RabbitMQ的灵魂: RabbitMQ是使用erlang开发,实现AMQP模型,使用mnesia数据库持久化数据。 理解Vhost、exchange、channel、queue、route key、producer、consumer,以及之间的相互关系。 理解exchange中的四种类型,direct、fanout、topic、headers。 如果能够充分理解3点,那么我觉得你已经学会RabbitMQ,接下来的6个教程,我更偏向把它理解成是RabbitMQ的应用场景,通过这六个场景的学习,能够深入我们的骨髓,在遇到技术问题的时候,我们能够恰当的选择RabbitMQ,那么我们就开始吧。 入门 本教程实现了从Producer发送消息,consumer接受消息的过程,也是RabbitMQ的基础的应用。 connect 下面的代码,将在每个.php文件,都应该有。为了简短篇幅,就在这入门篇,做统一的说明。在其他的章节中不再重复。 $config = [ 'host' => '192.168.80.122',…
2024-11-24 阅读全文 →
FWQ
Docker教程
RabbitMQ的PHP教程之工作队列 (二)
在上一篇文章中,简单实现了消息的发送与接受(参考:RabbitMQ的PHP教程之入门 (一)),但在实际的应用中,很少会使用,本人也不建议使用,因为这种隐藏式的申明,很容易给人造成困扰。但它展示了RabbitMQ的工作原理。   本人将介绍RabbitMQ work queues (工作队列),首先举例说明下工作队列的使用场景。有个高并发的某某活动,因为并发量很高,Mysql的写入的性能不能满足吞吐(其他类似于mongo的库除外),此时,可用借助RabbitMQ的工作队列来处理,将直接写入mysql的数据,以消息的形式先发送到RabbitMq的工作队列中,消费端从队列中消费数据入库,这样:1)客户端不需要考虑mysql的瓶颈,队列做为一个缓冲区。2)可用加入多个消费者,加速消费工作队列,避免造成工作队列消息积压。 我们再hello world的发送、接收的代码中,我做了几点调整。 指定exchange,并显式申明它的类型。 将exchange持久化,这样那怕Rabbit重启,exchange也不会消失。 将queue持久化,这样那怕Rabbit重启,queue也不会消失(包括queue中的消息) 在exchange  publish消息时,指定 route key,同时在queue中绑定rout key,这样exchange在转发消息时,能够将消息转发到与route key匹配的的队列中。 我们看具体的代码 send.php $conn = new \AMQPConnection($config); $conn->connect(); $channel = new…
2024-11-24 阅读全文 →
FWQ
Docker教程
RabbitMQ的PHP教程之发布/订阅 (三)
订阅模式可以理解为广播模式:即exchange会将消息转发到所有绑定到这个exchange的队列上。针对这种广播模式,RabbitMQ增加了exchange Type的选项 AMQP_EX_TYPE_FANOUT,这种类型在发送消息,queue bind时,都将忽略route key,也就是说不需要设置 route key。   举了实际应用的场景,比方说用户注册(注销,更改姓名等)新浪,同时需要开通微博、博客、邮箱等等,如果不采用队列,按照常规的线性处理,可能注册用户会特别的慢,因为在注册的时候,需要调各种其他服务器接口,如果服务很多的话,可能客户端就超时了。如果采用普通的队列,可能在处理上也会特别的慢(不是最佳方案)。如果采用订阅模式,则是最优的选择。 看下面的处理过程: 用户提交username、pwd….等之类的基本信息,将数据提交register.php中. register.php对数据进行校验,符合注册要求,生成uid,并将和基本信息json后,发布一条信息,同时直接显示用户注册成功。 exchange中的多个队列,如(queue.process、queue.boke、queue.weibo、queue.email)都接受到了这个消息,根据各业务自身的逻辑来处理。 下面来看下代码,和RabbitMQ的PHP教程之工作队列 (二) 的主要区别: 不在send.php中申明队列,因为发布 / 订阅模式下,是可以随时添加新的订阅队列。 exchange的Type指定为fanout(广播模式) 队列不需要指定route key,绑定exchange。 send.php $channel = new \AMQPChannel($conn); $channel->qos(0,0); $exchange…
2024-11-24 阅读全文 →
FWQ
Docker教程
RabbitMQ的PHP教程之Routing (四)
关于这一篇的教程,主要是针对Route Key的使用。在第二篇的文章中,我们使用direct类型的exchange实现工作队列。在这个基础之上,我们再进行一个扩展:即一个队列绑定多个route key,这样绑定多个route key的队列就能接收到不同route key的消息。但有一点是固定不变的,就是一个message只能有一个route key. 一个message最多只能有一个route key ,一个queue可以绑定多少个route key 举个实际的使用场景,日志系统(引用官方),假设产生一条日志的级别有debug, info, notice, warning, error, critical, alert, emergency八种级别(按照psr-3的日志标准,日志的级别有8个),我们希望日志消息发送到exchange后,warning, error, critical, alert, emergency转发到queue.log.error队列,notice转发到queue.log.notice队列,debug、info转发到queue.log.debug中。 此时需要使用到queue与多个route之间的绑定。 send.php $channel = new \AMQPChannel($conn);…
2024-11-24 阅读全文 →
FWQ
Docker教程
RabbitMQ的PHP教程之topic (五)
学习完了RabbitMQ的PHP教程之Routing (四),route的核心思想就是告诉我们,queue是可以绑定多少routeKey,同时接收多个routeKey的消息,在文章的末尾,我也总结exchange、routeKey、queue、message之间的对应关系 。在文中有以下几行代码:   $queue->bind('exchange.log','warning'); $queue->bind('exchange.logs','error'); $queue->bind('exchange.logs','critical'); $queue->bind('exchange.logs','alert'); $queue->bind('exchange.logs','emergency'); 我们搞PHP也知道,这种写法太过于死板。如果接收的消息routeKey很多,那我们就的一行行添加(当然你可以采用foreach循环),如果我们要对日志的来源进行再分类,比方说有register、login、mail等等,那么久需要bind很多的routeKey,大概会如下: $queue->bind('exchange.log','register.warning'); $queue->bind('exchange.logs','register.error'); $queue->bind('exchange.logs','register.critical'); $queue->bind('exchange.logs','register.alert'); $queue->bind('exchange.logs','register.emergency'); ....... $queue->bind('exchange.log','mail.warning'); $queue->bind('exchange.logs','mail.error'); $queue->bind('exchange.logs','mail.critical'); $queue->bind('exchange.logs','mail.alert'); $queue->bind('exchange.logs','mail.emergency'); 那么我们有没有一种办法来处理这种情况呢,这就是本章的学习的exchange中topic类型。 使用topic类型后,routKey支持模糊匹配,但仅支持以下2种写法: *(星号)可以代表一个单词 #(井号)可以代表零个或多个单词 //请务必注意是单词,此时的routeKey是使用.链接的字符串。 我还是举例说明吧,假设我们有一个需求,需要对日志的来源进行分类处理。 不管是从register、login还是mail中,warning,…
2024-11-24 阅读全文 →
FWQ
Docker教程
RabbitMQ的PHP教程之RPC (六)
RPC(Remote Procedure Call Protocol)远程过程调用协议,简称远程调用。但如果仅仅从这一层意义上来说,RabbitMQ的PRC没有实际的意义,因为远程调用接口服务,我们通过curl会更简单易用一些,而且PHP本身也有RPC调用的相关方法。但我要说的是,RabbitMQ的RPC主要用于消息消费后的回复。在这一点RabbitMQ就显得有意义了。因为我们有的时候,发送消息后,需要知道消费的情况,根据消费的情况做后续的逻辑。   在开始介绍之前,我们先了解下RabbitMQ消息的属性,以下是我从$envelope打印出来的信息。 [body:AMQPEnvelope:private] => [register]Message[warning] #消息内容 [delivery_tag:AMQPEnvelope:private] => 1 #在消费确认中会有使用到。 [is_redelivery:AMQPEnvelope:private] => [exchange_name:AMQPEnvelope:private] => exchange.all.logs #exchange的名称 [routing_key:AMQPEnvelope:private] => register.warning #routeKey [content_type:AMQPEnvelope:private] => application/json #消息的类型,我们一般设置为application/json…
2024-11-24 阅读全文 →
FWQ
Docker教程
Nginx中根据路径反向代理
今天在配置nginx的时,碰到的一个问题。   先来看下面的正确配置 upstream backend_122{ server 192.168.80.122 weight=5 max_fails=3 fail_timeout=30s; } upstream backend_122_02{ server 192.168.80.122:15672; } server{ listen 80; server_name 122.100.com; access_log /var/log/nginx/122.100.com.access.log main; error_log /var/log/nginx/122.100.com.error.log; location ^~…
2024-11-24 阅读全文 →
FWQ
Docker教程
RabbitMQ中的运维命令
之前在学习RabbitMQ原理的时候,觉得RabbitMQ的启动、停止命令好坑,还有app_start、app_stop,到底用哪个启动呀?有什么区别和联系吗?本人在学习官方教程的过程中,做了这篇笔记。   一、rabbitmq-server 这是第一个命令,也是最简单的,仅有一个可选项 -detached (这个地方不太容易记忆,detached英文释义:分离,这个以deamon的形式运行,有半毛钱关系呀) 带-detached和不带的区别: 带-detached,以deamon的形式运行。 不带-detached,在前端运行,这里有一个好处,如果在启动过程出错(配置文件错误等),能在前端看到错误信息,而带-detached则看不到,所以一般用于调试。 备注: 坑1:使用-detached,会有一个警告:Warning: PID file not written; -detached was passed. 坑2:cat /run/rabbit.pid 和ps aux | grep rabbit的进程id不一致。 二、rabbitmqctl rabbitmqctl [-n…
2024-11-24 阅读全文 →
FWQ
Docker教程
Bind中的zone语句的定义和用法
在了解Zone语句之前需要先了解view语句的用法,可参考文章下面的文章: Bind中的view语句定义和用法 [转]利用View特性来设置域名的多匹配查询 Bind 之recursion递归   zone 语句语法 zone zone_name [class] [{ type ( master | slave | hint | stub | forward ) ; [ allow-notify {…
2024-11-19 阅读全文 →
FWQ
Docker教程
Bind中的 options 语句定义和用法
options 语句设立可以被整个 BIND 使用的全局选项。这个语句在每个配置文件中只有一处。如果出现多个 options 语句,则第一个 options 的配置有效,并且会产生一个警告信息。如果没有 options 语句,每个选项择使用缺省值。   一、options 语句的语法: options { [ version version_string; ] [ directory path_name; ] [ named-xfer path_name; ] […
2024-11-19 阅读全文 →