发布于 2015-08-09 09:49:46 | 310 次阅读 | 评论: 0 | 来源: 网络整理
1.7.2新增特性,可将task进程单独设置为消息队列。带来的好处是:
在维持worker进程异步的前提下,task进程可使用消息队列提升任务排队的容量,unix sock受到缓存区尺寸限制,而消息队列不受限制,可以利用到操作系统所有的内存。 如你的机器有32G内存,如果是unix sock一般缓冲区只有8M。如果你的任务很多,会堆积在socket缓存区中。当超过缓冲区时就会无法再投递新的任务。 而消息队列,只要操作系统有剩余内存,那一直可以投递新的任务到队列中。
当前的swoole使用unix sock,只允许程序内部进行通信。采用消息队列后,拿到消息队列的key。其他程序就可以向此队列投递数据了。
task进程是可以与swoole_server所有的客户端连接进行通信的,所以外部程序使用消息队列作为IPC,就可以与所有客户端连接进行通信。
只需设置swoole_server::set参数即可。新增的参数如下:
task_ipc_mode => 0 | 1 | 2,默认为0就是普通的unix socket通信方式,1,2就是使用消息队列模式。模式1和模式2的不同之处是,模式1支持定向投递,$serv->task($data, $task_worker_id) 这里可以指定投递到哪个task进程。模式2是完全争抢模式,task进程会争抢队列,将无法使用定向投递,即使指定了$task_worker_id,在模式2下也是无效的。
message_queue_key => 0x72000100 ,指定一个消息队列key。如果需要运行多个swoole_server的实例,务必指定。否则会发生数据错乱
message_queue_key并不是task进程使用的key,task进程真正使用的key是 (message_queue_key + 2)
message_queue_key可是用 ftok(FILE)来设置