Skip to content
This repository has been archived by the owner on Sep 1, 2020. It is now read-only.

Latest commit

 

History

History
31 lines (19 loc) · 1.6 KB

2.3.6 - task_ipc_mode.md

File metadata and controls

31 lines (19 loc) · 1.6 KB

task_ipc_mode

设置Task进程与Worker进程之间通信的方式。

  • 1, 使用Unix Socket通信,默认模式
  • 2, 使用消息队列通信
  • 3, 使用消息队列通信,并设置为争抢模式

模式1

使用模式1时,支持定向投递,可在tasktaskwait方法中使用dst_worker_id,制定目标Task进程。

dst_worker_id设置为-1时,底层会判断每个Task进程的状态,向当前状态为空闲的进程投递任务。

消息队列模式

模式2和模式3使用sysvmsg消息队列通信。

  • 消息队列模式使用操作系统提供的内存队列存储数据,未指定 mssage_queue_key 消息队列Key,将使用私有队列,在Server程序终止后会删除消息队列。
  • 指定消息队列KeyServer程序终止后,消息队列中的数据不会删除,因此进程重启后仍然能取到数据
  • 可使用ipcrm -q 消息队列ID手工删除消息队列数据

模式2和模式3的不同之处是,模式2支持定向投递,$serv->task($data, $task_worker_id) 可以指定投递到哪个task进程。模式3是完全争抢模式,task进程会争抢队列,将无法使用定向投递,task/taskwait将无法指定目标进程ID,即使指定了$task_worker_id,在模式3下也是无效的。

模式3会影响sendMessage方法,使sendMessage发送的消息会随机被某一个task进程获取

注意事项

使用消息队列通信,如果Task进程处理能力低于投递速度,可能会引起Worker进程阻塞。