用于在发送之前收集数据的临时存储

时间:2017-05-05 11:14:13

标签: php concurrency storage monitoring

我正在为PHP应用程序开发一个composer包。目标是在请求,队列作业和其他操作之后发送一些数据。我最初(和工作)的想法是使用register_shutdown_function来做到这一点。这种方法存在一些问题,首先,这会增加页面响应时间,这意味着计算请求的开销,以及通过我的API发送数据。另一个问题是长时间运行的进程(例如队列工作程序)长时间不执行此方法,因此在创建数据与发送和处理数据之间可能存在巨大差距。

我的想法是我可以使用某种临时存储来存储数据,并且每分钟都有一个cronjob来发送它。我可以通过这种方法看到的唯一问题是管理高IO上的并发性。由于许多进程每隔(n)ms写入文件,因此读取文件并删除已发送的行时会出现问题。

我试图拼命避免的另一个选择是使用客户端数据库。这可能会导致性能问题。

这样做的首选方法是什么?

编辑:包本质上是一个监控代理。

1 个答案:

答案 0 :(得分:1)

这种方法存在一些问题,首先,这会增加页面响应时间,这意味着计算请求的开销,以及通过我的API发送数据

我不确定你能解决这个问题,在Web请求的上下文中做更多的工作会有额外的开销。我觉得使用基于作业队列/异步系统正在为客户端最小化这一点。无论您选择本地文件系统写入还是套接字写入,您都将获得额外的开销,但您将能够立即返回到客户端,而不会阻止处理该请求。

另一个问题是,长时间运行的进程(例如队列工作程序)长时间不执行此方法,因此在创建数据与发送和处理数据之间可能存在巨大差距。 /强>

这不是重点吗? :p立即返回客户端,然后在将来某个时候异步完成工作?使用作业队列可以分别对工作池和Web服务器进行解耦和扩展。您的网络服务器可能非常精简,因为繁重的工作推迟给工人。

我的想法是我可以使用某种临时存储来存储数据,并且每分钟都有一个cronjob来发送它。

我宁愿建议查看一个反对滚动你自己的工作队列。这已经解决了,并且有很多非常受欢迎的开源项目来处理这个(任何一个MQ)。分钟cron工作是否会为客户端进行计算?你如何扩展?如果一个文件有1000个条目,或者你缩放10x并且有10000个,你可以在不到一分钟的时间内完成所有这些计算吗?如果服务器死了怎么办?你怎么恢复?进程间并发?您是否需要为每个流程管理锁定?你会为每个进程和每一分钟使用一个单独的文件吗?斗争事件?如果你想要不到1分钟的运行会发生什么?

耐用性保证

您为客户提供什么样的保证?如果请求返回,客户端是否可以确保该作业是持久的,并且将在未来的某个时间完成?

我建议选择一个工作队列,让你的web服务器进程写入它。这是一个非常受欢迎的问题,如何扩展它有如此多的资源,并具有明确的耐用性和性能保证。

enter image description here