安装过程
$config = [
// .........
'aliases' => [
'@nineinchnick/nfy' => '@vendor/nineinchnick/yii2-nfy',
],
'modules' => [
'nfy' => [
'class' => 'nineinchnick\nfy\Module',
],
],
'components' => [
'dbmq' => [
'class' => 'nineinchnick\nfy\components\DbQueue',
'id' => 'queue',
'label' => 'Notifications',
'timeout' => 30,
],
'sysvmq' => [
'class' => 'nineinchnick\nfy\components\SysVQueue',
'id' => 'a',
'label' => 'IPC queue',
],
'redismq' => [
'class' => 'nineinchnick\nfy\components\RedisQueue',
'id' => 'mq',
'label' => 'Redis queue',
'redis' => 'redis',
],
// ..........
],
]
基本工作流程
基本概念: 消息系统的基本流程应该是,首先存放消息,放入数据库,在存放消息的通过指定一个或者一些属性,来决定这个消息谁可以来读;然后,其他用户在访问消息队列的时候便可以得到他可以读的消息;
在这个消息系统里面可能有稍微的不同,首先是由接收者subscibe了某几条队列(一个人监听一个queue需要创建一个subscription),并且指定好这个几条subcription的category,然后发送者在发送消息的通过指定category来决定将这个message发送给那几个subscription,最后接收者在receive message的时候,会收到发送者发送过来的消息
工作流程代码实现
// 这样往数据库里面存入一条 没有subscribe_id的message, 状态为available
Yii::$app->dbmq->send('test');
//在接收者这端使用下面命令,就可以接收这条数据
Yii::$app->dbmq->receive();
// 或者
Yii::$app->dbmq->peek();
// 上面两条代码都是接收无subcription_id的数据
// 我们可以subscribe 看成订阅这个动作,subcription看成是我们订阅的杂志
// 接收者, subscibe 队列id为queue,cateogry为 ['test', 'admin'] 的subscription
Yii::$app->dbmq->subscribe(Yii::$app->user->getId, [
'test',
'admin',
]);
// 或者我们可以发送一些指定某个属性之后,只有特定人群可见的message
/**
* 发送者:发送一条body 'this is test'的message
* 1. 通过指定category 决定subscribe哪个subscription的人可以接收到消息
* 2. 如果有十个人subscibe了category为['test','admin','project']的subscription,则在系统里面会生成11条message, 如果没有subscibe category为如下的subscription,者在系统里面只会生成一条message
*/
Yii::$app->dbmq->send('this is test', [
'test',
'admin',
'project',
]);
// 接收者指定subscribr_id来接收消息,在接收到消息之后,会将消息的状态置为deleted
Yii::$app->dbmq->receive(Yii::$app->user->getId());
小结:
接收者要想接收到消息
初步评估
优点
缺点: