【发布时间】:2020-02-24 13:25:03
【问题描述】:
我的 Plack Web 服务通过与 fluentD 的 TCP 连接进行日志记录,并且我想在将响应发送回客户端后执行我的日志记录代码。这将减少响应时间(假设这是一个高请求量服务,值得进行这种性能优化)。
至少有一个其他的 web 框架,用于 nodejs,通过启用中间件添加 on-end event handler to the request object 来支持这一点。 我查看了Plack::Request 和Plack::Response 接口,但没有看到类似的事件挂钩。
我想我可能会在我的中间件中对 finalize 方法进行本地覆盖,以强制框架在响应完成后进行日志记录,但如果可能的话,我想避免修改 Plack 内部结构。
有没有更好的方法可以将某些代码的执行推迟到向客户端发送响应之后?
【问题讨论】:
-
您网络服务器上的所有代码都可以分为两部分:服务响应和相关工作。通常为相关工作提供队列服务是最好的解决方案。所以...为什么你不想添加队列?
-
您可以使用钩子,在发送响应后,您可以通过在函数中调用 next() 在另一个钩子中执行后台进程。
-
事件挂钩在 Plack 中是可选的,因为基本实现必须足够抽象才能在多种类型的服务器上运行。例如,使用
Plack::Handler::Net::Async::HTTP::Server公开$env->{'io.async.loop'}。
标签: perl asynchronous middleware deferred-execution plack