rabbitmq消息中间件的初步探索
在上次学xattr的时候用它简单实现一个中间件,我去了解了一下rabbitmq这个消息中间件,感觉理论上还是挺好用的,给一般并发量的系统用足够了。
首先安装这个服务。
sudo apt search rabbitmq
发现了这个
rabbitmq-server/focal-updates,focal-updates,focal-security,focal-security,now 3.8.2-0ubuntu1.3 all
AMQP server written in Erlang
好,然后安装它
sudo apt-get install rabbitmq-server
等他跑完就行了,要用PHP调用的话需要这个php组件
composer require php-amqplib/php-amqplib
跑完后创建两个文件 receive.php 和 send.php
receive.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection; $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
echo ' [*] waiting for message. ctrl+c to stop', "\n";
$callback = function($msg) {
echo " [x] Received " . $msg->body . "\n";
};
$channel->basic_consume('hello', '', false, true, false, false, $callback);
while (count($channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
send.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage; $start_time = microtime(true); $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello world!');
$channel->basic_publish($msg, '', 'hello');
// echo " [x] Send 'Hello world'\n";
$channel->close();
$connection->close(); $end_time = microtime(true); echo "use time " . ($end_time - $start_time) * 1000 . " ms \n";
先运行 php receive.php 它就一直在监听消息
[*] waiting for message. ctrl+c to stop
再运行 php send.php 进行投递消息
就可以看到效果了。
[*] waiting for message. ctrl+c to stop
[x] Received Hello world!
关于这个例子 这篇文章介绍了很详细 https://www.rabbitmq.com/tutorials/tutorial-one-php.html
git仓库在这里 https://github.com/php-amqplib/php-amqplib
除了这个composer之外 还可以安装PHP的扩展
sudo apt-get install php7.4-amqp
安装后用 php -m |grep amqp 来验证一下扩展是不是真的安装上了。
如果我不运行receive.php 直接运行send.php会怎么样呢?
我发现它会把消息堆积放在中间介质里面(当然这个应该是rabbitmq server服务里面的一部分)
只运行 send.php 不运行receive.php 发现有消息堆积 我们可以用 sudo rabbitmqctl list_queues 来查看列表
sudo rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name messages
hello 3
我执行了send.php3次留下来3条消息,在仓库列表里面等待处理。
此时再运行receive.php 然后进来就有消息输出 再看看列表,发现没有消息堆积了
sudo rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name messages
hello 0
这说明生产者是可以随时生产投递到中间存储的,消费者启动的时候会自己去消费堆积任务。
如果生产者消费者都在运行,那么生产者投递的消息马上就被消费者处理了。
当你运行两个receive.php的话
然后让 send.php 执行10个消息投递
for ($i=0; $i < 10; $i++) {
$msg = new AMQPMessage('Hello world!'.$i);
$channel->basic_publish($msg, '', 'hello');
}
1个消费者打印
[*] waiting for message. ctrl+c to stop
[x] Received Hello world!0
[x] Received Hello world!2
[x] Received Hello world!4
[x] Received Hello world!6
[x] Received Hello world!8
另1个消费者打印
[*] waiting for message. ctrl+c to stop
[x] Received Hello world!1
[x] Received Hello world!3
[x] Received Hello world!5
[x] Received Hello world!7
[x] Received Hello world!9
看来它俩分配了消息
然后对于这个效率的话,我做了一个测试
投递 1 万条消息耗费 228 ms 合约 43859 条/秒
投递 10 万条消息耗费 1512 ms 合约 66137 条/秒
投递 100 万条消息耗费 18785 ms 合约 54990 条/秒
for ($i=0; $i < 10000; $i++) {
$msg = new AMQPMessage('Hello world!'.$i);
$channel->basic_publish($msg, '', 'hello');
}
for ($i=0; $i < 100000; $i++) {
$msg = new AMQPMessage('Hello world!'.$i);
$channel->basic_publish($msg, '', 'hello');
}
for ($i=0; $i < 1000000; $i++) {
$msg = new AMQPMessage('Hello world!'.$i);
$channel->basic_publish($msg, '', 'hello');
}
可以看出这个投递极限也就是单个进程每秒5-6万条左右,总体而言效率还算不错,已经能满足很多系统了,毕竟业务上也没有那么多消息要传递,如果非要更快,那就需要考虑用更快的xattr或者共享内存之类的了。
rabbitmq消息中间件的初步探索的更多相关文章
- NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索
一.主从复制架构简介 通过前面几篇的介绍中,我们都是在单机上使用Redis进行相关的实践操作,从本篇起,我们将初步探索一下Redis的集群,而集群中最经典的架构便是主从复制架构.那么,我们首先来了解一 ...
- 【转】 NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索
一.主从复制架构简介 通过前面几篇的介绍中,我们都是在单机上使用Redis进行相关的实践操作,从本篇起,我们将初步探索一下Redis的集群,而集群中最经典的架构便是主从复制架构.那么,我们首先来了解一 ...
- spring boot / cloud (九) 使用rabbitmq消息中间件
spring boot / cloud (九) 使用rabbitmq消息中间件 前言 rabbitmq介绍: RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.它可以用于大型软件系统 ...
- 企查查app 初步探索
企查查app sign算法破解初步探索 之前有说过企查查的sign的解密,但这次是企查查app的sign算法破解,目前是初步进程. 已删除!!!! 上边一些变量已经找到了,其中就有时间戳,其余两个需要 ...
- Springboot与ActiveMQ、Solr、Redis中分布式事物的初步探索
Springboot与ActiveMQ.Solr.Redis中分布式事物的初步探索 解决的场景:事物中的异步问题,当要求数据库与solr服务器的最终一致时. 程序条件: 利用消息队列,当数据库添加成功 ...
- rabbitmq介绍以及初步使用
什么是MQ? MQ(Message Queue):翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断地从队列中获取消息.因为消息的生产和消费都是异步的,而且只 ...
- RabbitMQ 消息中间件
RabbitMQ 是使用 Erlang 语言开发的消息中间件, 其遵循了高级消息队列协议(Advanced Message Queuing Protocol, AMQP). 与 Kafka 等消息队列 ...
- CentOS6.8搭建rabbitmq消息中间件
参考资料:http://blog.csdn.net/yunfeng482/article/details/72853983 一.rabbitmq简介 MQ全称为Message Queue, 消息队列( ...
- python中使用rabbitmq消息中间件
上周一直在研究zeromq,并且也实现了了zeromq在python和ruby之间的通信,但是如果是一个大型的企业级应用,对消息中间件的要求比较高,比如消息的持久化机制以及系统崩溃恢复等等需求,这个时 ...
- RabbitMQ消息中间件的用法
1.什么是RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消 ...
随机推荐
- 【Python】Selenium自动化测试之滑块拼图验证码图片方法
在项目中有时验证码是滑块拼图形式的,这种验证码该如何完成验证呢? 有以下几个步骤: 目录 第一步:得到验证码图片 第二步:匹配缺口照片在完整照片的位置 第三步:机器模拟人工滑动轨迹 第四步:判断拼图是 ...
- mysql bit(1) 字段insert 报错 Data too long
insert数据时,给bit(1)字段赋值 '1' 报错 将字符串'1',修改为数字1即可
- UC_Center整合单点登录后远程注册不激活问题的解决办法
修改:bbs目录\uc_server\model\user.php 下方法add_user 如下: function add_user($username, $password, $email, $u ...
- Figma 学习笔记 – Color
大纲 Figma 的颜色是通过 FIll 实现的 (Fill 还有其它功能比如 fill 图片) 整体大概长这样, 我们一个一个看 颜色和 opacity
- Excel 国产化替换新方案
前言 在当前数字化转型和信创(信息技术应用创新)战略背景下,企业对于安全性.自主可控性和高效办公工具的需求日益增加.作为一款国产自主研发的高性能表格控件,SpreadJS 正成为替换 Excel 的最 ...
- nuxt(搁置)
https://nuxt.com.cn/docs/getting-started/installation 开始使用 全栈Web应用和网站 Nuxt使用约定和一套规范的目录结构来自动化重复的任务,让开 ...
- Python 项目配置管理框架技术选型
一.背景介绍 在实际生产项目中,不同环境(如开发.测试.生产环境)常有不同配置需求,如数据库链接等.我们期望一份代码无需改动,仅通过单一配置变量调整就能适配和使用多个环境,实现 "一份代码, ...
- Android Perfetto 系列 3:熟悉 Perfetto View
1. Perfetto View 界面 抓到 Perfetto Trace 之后,一般是在 ui.perfetto.dev 中打开(如果用官方提供的脚本,则会在抓去结束后自动在这个网站上打开,想看看怎 ...
- 线段树介绍(segment tree)
1.引入 给定一个区间\([1, n]\),希望你实现一种数据结构,支持以下操作: 1.修改\(i\)号节点的值. 2.询问区间\([i, j]\)中所有节点的和. 这不是树状数组板子 3.修改区间\ ...
- 干货必收藏!墨天轮最受DBA欢迎的250份学习文档合集
作为一个DBA,必须要精通SQL命令.各种数据库架构.数据库管理和维护.数据库调优,必要的时候,还需要为开发人员搭建一个健壮.结构良好.性能稳定的数据库环境. 技术也是不断进步的,社会的发展要求DBA ...