用PHP实现“发送推送通知”计算机的最佳方法?

时间:2019-06-06 12:38:47

标签: php multithreading push-notification

我知道已经有一些关于该主题的帖子,但是都无法回答我的情况。我有一台要在其上创建最快和更灵活的实现来发送推送通知的机器。基本上,问题在于,对于我的应用程序,我会在午夜向所有用户发送通知。如果说有5000万用户,那么如果我将它们排队等待,则通过TCP将所有这些通知发送给Apple最多可能需要1个小时。基本上我想:

  • (1)尽快发送这些午夜通知
  • (2)无论发送这些午夜通知需要花费多长时间,都必须立即传递高优先级通知,例如当用户向应用程序中的另一个用户发送消息时。
  • (3)系统必须可靠:如果APN(Apple服务器)针对一个通知返回了任何错误,则必须传递队列中上述所有其他通知

我的第一个问题是问题(1)

是否在多个线程/进程上同时打开与Apple的多个TCP连接会更快地发送大量通知?或者,最好保持一个TCP连接并将所有这些50M通知排队在其中?当然,选择1时,一个TCP连接将同时采用某个通知窗口(例如10000),以避免完全填满内存

第二个问题是问题(2):

这种非常大的午夜发送会导致另一个问题:无论发送所有这些“午夜通知”花费什么时间,我的发送方计算机都需要从db轮询并发送在“非常大发送”期间会发生的任何新通知,并且实时传递(如果user1在12.01AM发送消息到user2,则user2需要立即接收其通知)。

为此,我认为一个好的解决方案是在数据库中设置一个优先级标志,并将任何高优先级通知放在发送队列的前面。您认为这是一个很好的解决方案吗?或者创建一个仅在具有高优先级通知的另一个TCP con的其他进程上运行的PHP脚本更好?

第三个问题是问题(3):

Apple在遇到错误时关闭TCP流。但是这个错误在发生后不久就会传给我。因此,在Apple服务器中发生错误的时间与我收到php错误“ TCP连接关闭”之间的所有时间,从我的机器通过TCP发送的所有通知最终都将无法传递。因此,系统还需要检索任何Apple错误,检测是哪个通知(i)引起了问题,然后从索引(i + 1)重新开始,以在新的TCP连接上再次发送上述通知。

第四个问题更具全局性:

您认为在数据库上进行写和轮询是一种好习惯,还是通过LAN通过TCP将来自Apache的直接消息发送到Send Notification Machine更好?使用数据库的优点:如果有说要发送50M广告推送通知,请避免RAM溢出,缺点:可能慢得多(mysql的读/写操作)?

最后,您对我可以用来实现这种复杂机制的算法(php脚本)有任何想法吗?谢谢您阅读我

0 个答案:

没有答案