我正在构建一个需要在一天中的固定时间向用户发送通知的应用程序。用户可以选择他们希望在一天中的哪个时间收到通知,以及他们希望在哪一天收到通知。例如,用户可能希望每天早上 6 点收到通知,或者只在工作日早上 7 点收到通知。
在后端,我不确定如何构建发送这些通知的服务。解决方案需要处理:
最佳答案
使用消息代理,例如 RabbitMQ和任务调度程序,例如 Celery可以满足您的要求。
异步或非阻塞处理是一种将某些任务的执行与程序的主要流程分开的方法。这为您提供了几个优势,包括允许您面向用户的代码不间断地运行。
消息传递是程序组件可以用来通信和交换信息的一种方法。它可以同步或异步实现,并且可以允许离散进程毫无问题地进行通信。对于这种类型的使用,消息传递通常作为传统数据库的替代方案来实现,因为消息队列通常实现附加功能,提供更高的性能,并且可以完全驻留在内存中。
Celery 是一个建立在异步消息传递系统上的任务队列。它可以用作可以转储编程任务的存储桶。传递任务的程序可以继续执行和响应式地运行,然后它可以轮询 celery 以查看计算是否完成并检索数据。
虽然 celery 是用 Python 编写的,但它的协议(protocol)可以用任何语言实现。 worker 是 Celery 在 Python 中的一个实现。如果该语言有一个 AMQP 客户端,那么用您的语言创建一个 worker 应该不会做太多工作。 Celery worker 只是一个连接到代理以处理消息的程序。
此外,还有另一种语言独立的方法,那就是使用 REST 任务,而不是你的任务是函数,它们是 URL。有了这些信息,您甚至可以创建能够预加载代码的简单 Web 服务器。只需公开一个执行操作的端点,并创建一个仅对该端点执行 HTTP 请求的任务。
这是来自官方documentation的python示例:
from celery import Celery
from celery.schedules import crontab
app = Celery()
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# Calls test('hello') every 10 seconds.
sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')
# Calls test('world') every 30 seconds
sender.add_periodic_task(30.0, test.s('world'), expires=10)
# Executes every Monday morning at 7:30 a.m.
sender.add_periodic_task(
crontab(hour=7, minute=30, day_of_week=1),
test.s('Happy Mondays!'),
)
@app.task
def test(arg):
print(arg)
关于service - 构建可配置的用户通知服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43018649/