Laravel 抽奖项目。队列是实现此目标的最佳方法吗?

Laravel Raffle Project. Is a Queue the best way to achieve this?

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

Laravel 乔布斯是解决这个问题的最佳方式吗?我是否只创建一个永远重复的工作来检查是否有任何抽奖活动已经结束并需要赢家?

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

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

I just create a single forever-repeating job

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

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

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

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

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

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

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

为什么我不使用延迟作业
症结所在——可维护性

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

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

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