【问题标题】:Is an Event Dispatcher the appropriate solution?事件调度程序是合适的解决方案吗?
【发布时间】:2015-09-03 13:19:06
【问题描述】:

我正在开发一个 API 项目,该项目需要在响应返回给客户端之后(或之前取决于实现)发送电子邮件并存储统计信息。对于这两种情况,我都在考虑 Symfony 的 EventDispatcher 组件(我没有使用 Symfony 作为框架),因此每个控制器操作都会调度一个事件以将电子邮件添加到队列或将数据插入到统计数据库表中。

所以事情看起来像这样

Controller 
    => Send Response to client
    => Dispatch Event email => EmailEventListener => Mail queue
    => Dispatch Event stats => StatsEventLister => Database 

我正在考虑这个,因为我希望这个内部操作尽可能地异步。这是适合这种情况的解决方案吗?

编辑:正如Jovan Perovic 建议的那样,我正在添加更多信息。 API 是一个 REST API,用户通过 Web 或移动应用程序与其通信,我想记录、存储统计信息和发送通知(主要是电子邮件)而不影响 API 的性能,第一个想法是使用返回后运行的东西对客户端的响应,但我不知道是否可以使用 EventDispatcher。即使使用队列来处理统计信息或通知,我也需要一个集中的地方,所有控制器都可以发送信息以便写入日志并存储统计信息。

我希望我的目标现在更加明确。对不起。

【问题讨论】:

  • 这是有道理的,但如果没有更多信息,我们无法判断这是否是正确的做法。
  • 感谢 Jovan,我已在问题中添加了更多信息,希望现在可以更好地解释。
  • 遗憾的是,如果不使用shell_exec通过命令行调用脚本,php 就没有异步性
  • 是的,我知道 PHP 中没有异步,但主要目标是不惩罚用户在调用操作时我想运行的内部统计信息和进程。谢谢。

标签: php symfony events event-dispatching


【解决方案1】:

我认为您可以使用Request filtersAfter 适合您),尽管我从未尝试在Symfony2 框架之外使用它们。

对于异步操作,一般来说,套接字是你的朋友。您可以通过将数据发送到某个套接字来外部化逻辑,该套接字将相应地处理数据。 如果该处理是非必要的(例如电子邮件和统计信息),即使您的外部机制失败,您的请求也可能会完成。

我前段时间读过关于Gearmanhere(只是一个例子)的文章,这可能有助于通过创建单独的工作来将其外部化。

希望这能在这里有所启发:)

【讨论】:

  • 这看起来是一个很好的解决方案,但不幸的是,由于我没有使用 symfony2 Request 组件,我认为我无法使用它们。但是这个解决方案使用 EventDispatcher 的事实我想我可以使用 Slim 钩子来模拟这个解决方案。我的疑问是如果控制器已经完成,我可以在哪里存储创建事件或存储数据所需的信息。谢谢
  • 在上一个项目中,我将类似的数据(责备日志)移至 ELK(ElasticSearch+Logstash+Kibana)堆栈。你可以调查一下。它可能也适合你。
  • 是的,非常好。我在之前的项目中使用过 ELK,它非常好,但在这个项目中,我无法创建 ELK 所需的基础设施,至少现在不能。非常感谢!!
  • 啊,这是真的 - 它确实需要一些工作:-/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2011-04-25
相关资源
最近更新 更多