【问题标题】:Laravel Raffle Project. Is a Queue the best way to achieve this?Laravel 抽奖项目。队列是实现这一目标的最佳方式吗?
【发布时间】:2016-02-21 14:04:07
【问题描述】:

我正在创建一个抽奖网站作为一个小项目。它将处理多个抽奖,每个抽奖都有一个结束时间。在每次抽奖结束时,将选出一名获胜者。

Laravel Jobs 是解决这个问题的最佳方式吗?我是否只是创建一个永远重复的工作来检查抽奖活动是否已经结束并需要中奖者?

如果没有,最好的方法是什么?

【问题讨论】:

  • 如果只是为了断舌,我已经投了赞成票。 “Laravel Raffle”……不管它变成什么样子,它都会有一个很棒的程序名称 :)

标签: laravel queue laravel-5.2 beanstalkd


【解决方案1】:

我认为永远重复的脚本通常不是一个好主意。

我只是创建一个永远重复的工作

这几乎不是一个好主意。它在遗留代码库中有其应用程序,但最好考虑使用 websockets 和事件来完成这项工作。此外,您还可以使用像 Laravel 这样非常好的框架,所以好好利用它

Websockets
如果您希望人们在浏览器中得到实时通知。

如果您的所有用户在加载页面时都订阅了 websocket 频道,您可以轻松地向 websocket 服务器发送消息给所有订阅的客户端(即浏览器),让他们知道谁是获胜者。

然后,在您的客户端代码 (Javascript) 中,您可以解析该消息以确定谁是获胜者,并呈现一个让用户知道的弹出窗口。

事件
如果您不介意延迟一点,那么绝对可以使用事件。

在每个可能结束抽奖的操作结束时(即,计算机随机选择一个名称 - function chooseName())。触发一个事件,通知抽奖的所有参与者。 https://laravel.com/docs/5.2/events

注意:我已将上述两个问题列为单独的问题,但实际上,它们可以一起使用。例如,在随机选择名称的事件中,确定抽奖是否结束并通过websocket通知客户 连接。

为什么我不会使用延迟作业
原因的症结 - 可维护性

想象一个场景,其中某件事将您的抽奖时间延长了一周。这可能是因为抽奖被骗或其他原因(无法真正想到该领域的所有用例)。

现在,你的工作有一个固定的延迟——当只有一个场景改变时,必须改变两件事真的是一个好的编程原则吗?没有。有类似事件的东西 - onRaffleEnd - 明确地寻找事件的发生。 Laravel 不在乎该事件何时发生。

使用延迟的作业可以工作 - 在您的场景中这不是一个好的编程用例,并且限制了您在较长时间内能够做的事情。当出现不可预见的情况以及你想要改变的时候,它会迫使你做出更多的考虑。这也分散了与抽奖相关的逻辑。虽然解耦代码是一种很好的做法,但将逻辑放在完全不同的地方会使维护成为一场噩梦。

【讨论】:

  • 非常有趣。我什至没有想过 websockets 来提醒用户。那会很酷。关于事件。我有点担心,因为网站一开始会很小,所以事件可能暂时不会触发。为使用 Queue::later 广告创建的每个抽奖活动创建作业是否存在任何性能问题?
  • @THeK - 我不确定事件在一段时间内不会被触发的事实证明不使用事件是合理的。但是,您围绕延迟的工作提出了一个有趣的观点。我将更新我的答案以解释为什么我认为这不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多