我正在创建一个抽奖网站作为一个小型项目。它将处理多个抽奖活动,每个抽奖活动都有一个结束时间。在每次抽奖结束时,选择一名获胜者。
Laravel Jobs是最好的方式吗?我是否只创建一个永远重复的工作来检查是否有任何抽奖结束并需要获胜者?
如果没有,最好的方法是什么?
答案 0 :(得分:1)
我不认为永远重复的脚本通常是个好主意。
我只是创建一个永远重复的工作
这几乎不是一个好主意。它在遗留代码库中有其应用,但最好考虑使用websockets和事件来完成这项工作。此外,您还可以使用像Laravel这样的非常好的框架,因此可以利用它
<强>的WebSockets 强>
如果您希望在浏览器中实时通知人们。
如果您的所有用户在加载页面时都订阅了websocket频道,您可以轻松地向websocket服务器发送消息给所有订阅的客户端(即浏览器),让他们知道获胜者是谁。
然后,在您的客户端代码(Javascript)中,您可以解析该消息以确定获胜者是谁并呈现一个让用户知道的弹出窗口。
<强>事件强>
如果你不介意一点延迟,那么绝对会使用事件。
在每一个可能会结束抽奖的行动结束时(即,计算机随机选择一个名称 - function chooseName()
)。触发一个事件,通知抽奖中的所有参与者。
https://laravel.com/docs/5.2/events
注意:我已将上述两个问题列为单独的问题,但实际上,可以一起使用。例如,在 事件 中随机选择名称,确定抽奖活动是否结束并通过 websocket 通知客户连接。
为什么我不会使用延迟工作
原因的关键 - 可维护性
想象一下,将抽奖时间延长一周的情况。这可能是因为抽奖被欺骗或其他事情(无法真正想到该领域的所有用例)。
现在,你的工作有一个固定的延迟 - 当只有一个场景发生变化时,必须改变两件事是否真的是一个很好的编程原则?不。有类似事件的事件 - onRaffleEnd
- 明确地查找事件的发生。当事件发生时,Laravel并不在乎。
使用延迟作业可以正常工作 - 它只是您的方案中不是一个好的编程用例,并且限制了您在较长时间内可以执行的操作。当不可预见的情况发生以及你想要改变时,它会迫使你做出更多的考虑。这也分散了与你的抽奖相关的逻辑。虽然解耦代码是一种很好的做法,但逻辑处于完全不同的位置会使维护成为一场噩梦。