数据库作为 IPC(进程间通讯)
让我来为你澄清一下:你的数据库不是一个消息队列系统。你不能用它来安排工作或排队完成任务。如果你需要这样做,可以使用队列系统。你的数据库是用来存放数据的……线索就在名字里;不要把临时信息塞进去。
这是个坏主意的原因有很多。其中一个主要问题是,在数据库中,没有真正的方法可以不执行策略来保证双读不会发生,那就是使用行锁。这反过来又会导致进程(传入传出)被阻塞,进而导致处理只能以串行方式进行。
此外,为了检查是否有工作要做,你最终基本上要计算数据库中的数据行数,看看是否有工作要做;你需要持续运行。MySQL 不支持推送通知;与 PostgreSQL 不同,它没有与 LISTEN
通道配对的 NOTIFY
命令。
还要注意的是,当你将作业队列与存储真实数据的数据库表合并时,每次完成作业和更新标记都会使缓存失效,这反过来又会大大降低 MySQL 的运行速度。简而言之,这会导致数据库性能下降,并可能迫使关键信息的运行速度减慢到停滞状态。您必须小心谨慎,不要让这种功能悄悄地将您的数据库变成作业队列;相反,应将数据库完全用于数据,并在扩展数据库时牢记这一点。
RabbitMQ 提供了一个开源队列系统,并提供了一些优秀的 PHP SDK。