我目前正在使用Catalyst,一个MVC Perl Web框架来开发一些应用程序。我以前在另一种语言中使用了另一种框架,允许我运行异步代码。让我举一个常见的例子:现在,如果我需要发送3封电子邮件,用户发出请求,服务器发送3封电子邮件,然后返回“确定”。信息。一个好的方法是,用户发出请求,并立即返回“确定”,您的消息将很快发送,并且在后端,电子邮件将异步发送。
我正在考虑在数据库上创建自己的任务计划系统,方法名称','参数'和'运行日期'作为表的行,然后使用cron作业调用定义的方法名称'使用指定日期的参数。
也许我在这里重新发明轮子,但目前我还没有找到允许我进行这种类型的异步方法调用的任何模块或技术。
在perl中进行异步方法调用的推荐方法是什么?该任务无需安排。
答案 0 :(得分:4)
你正在重新发明轮子。这里的一般模式是,将工作发送到其他可以完成的地方而不需要占用可用于绘制网页等用户交互式任务的Web流程。
在纯Perl空间中有Gearman,一个分布式作业队列系统。
您还可以使用现有的消息队列系统,如RabbitMQ或ActiveMQ,甚至是Redis;只需将消息丢弃到队列中,该消息说明哪些邮件需要发送到谁以及谁,并编写将消息从队列中拉出并对其执行操作的工作人员。大多数人在某个时候使用SQL数据库中的表重新发明工作队列概念;它不是最好的主意。
最后,您可以确认已经的电子邮件服务器您要求的系统。它接受一条消息,它确保磁盘上有空间,它尽可能快地说“OK”,然后它负责将消息发送到后台的最终目的地。它会根据需要重试,如果交付最终没有通过,它会向您发出失败通知。它非常接近完美的消息队列。如果您运行自己的邮件服务器,如果您可以保证它们具有高可用性,并且如果您没有做任何昂贵的工作来“生成”电子邮件,那么这些建议的其余部分可能是无稽之谈,您应该做的是只是从你的应用程序中发送消息。它是“同步的”,但你所做的只是将这些位发送给其他人(邮件服务器)来进行操作。它只不过是你用另一种方法做的,除了它涉及不那么脆弱的本土代码。
答案 1 :(得分:1)
我不知道这会有多大用处,但有一个模块可以在发送响应后运行代码Catalyst::Plugin::RunAfterRequest。