与 Mendix 9,我们引入了 任务队列 允许您以分布式方式异步运行微流或 Java 操作。此功能使您能够构建高性能无状态应用,而无需考虑同步和任务管理。
在这篇文章中,我将向您详细介绍任务队列以及它与已弃用的进程队列模块的区别。我还问过 马塞尔·格罗内韦格,以 Mendix ITvisors 的专家和 MVP 与我们分享了他使用任务队列的一些初步经验。
什么是任务队列?
任务队列是一种可水平扩展的排队解决方案,可帮助您提高应用的可靠性和性能。您可以在后台执行长时间运行的任务,以免用户等待,将负载分配到多个运行时实例,并使用多个队列以最佳方式分配资源。
任务队列通常用于事务量很大、任务需要很长时间或 可靠性是关键。所有节点都可以接收排队任务,从而有效地将水平扩展选项添加到工具箱中。执行过程中失败的节点接收的任务将被再次接收,因此您不太依赖单个节点的成功。由于您也可以对来自计划事件的任务进行排队,因此您可以解决计划事件对单个节点的依赖,并确保始终执行批量任务。
太棒了。我该如何开始呢?
开始使用任务队列很简单。在 Studio Pro 中添加新任务队列后,您可以在 调用微流 活动,微流应在后台执行。将任务加入队列后,它将被您的一个运行时实例拾取进行处理。最后,它将被移动到 已处理队列任务 具有成功状态的表,您可以据此实现进一步的逻辑。
这是我们的做法。
例如
假设管理员想要根据数据库中的账单列表生成 PDF 和 Word 文档。用户按下按钮触发微流程,该按钮会循环调用子微流程来生成文件。如果没有任务队列,页面将显示加载栏,直到操作完成,从而阻止用户在此期间使用该应用。
为了改善这一点,我们可以指定子微流应通过任务队列执行。由于现在所有节点都可以帮助生成文档,因此用户将更快地获得结果,并且在后台生成文件时不会被阻止。

与进程队列的比较
任务队列和已弃用的 进程队列 模块:
- 任务队列是 Mendix 因此不再需要您设置额外的实体和关联,从而降低了域模型的复杂性。
- 如果您认为这很好,任务队列还允许水平扩展,使其成为多实例环境的首选解决方案。
- 最终,任务队列将支持自动重试任务,这是今年晚些时候的计划。
任务队列的使用经验
这一切都很好,但任务队列在现实场景中是如何工作的呢?我和 马塞尔·格罗内韦格,认证 Mendix 专家在 信息技术顾问 金益辉 Mendix MVP,已经在 Mendix 9.
问:您对任务队列做了什么?
答:我们替换了一些之前从进程队列执行的长时间运行的后台进程。这些后台进程从外部系统收集数据并进行处理。我们还使用队列来下载图像。每张图片都是一个单独的任务,以防止一次下载失败破坏所有其他下载,并保持事务大小较小。
问:到目前为止,你喜欢它吗?
答:易于使用,在模型中配置这一点非常好。部署后无需在应用程序本身的配置页面中进行更多配置。
问:从进程队列模块迁移情况如何?
答:非常简单。只需配置一个或多个队列,更改微流参数(删除与流程队列相关的附加实体),并用单个微流调用活动替换调用微流中的流程队列逻辑。
问:您为这次迁移做了哪些准备?
答:通过右键单击模型中的 Process Queue 模块以“查找用法”,可以轻松确定影响。对于每个后台任务,从您的实体到 ProcessQueue.QueuedAction 都存在跨模块关联,这些关联需要清理。剩下的是对 ProcessQueue.Process 实体的引用,用于配置和项目安全设置,这些引用也可以删除。
问:对未来有什么建议吗?
答:集群范围的限制(一次只运行一个任务)和具有指数重试间隔的自动重试将会很棒。除此之外,如果在 Java 操作中调度任务时返回标识符以便我们跟踪它,那将会很方便。最后,能够设置延迟或特定执行时间将非常强大。
开始吧!
在这篇博客中,我介绍了任务队列的功能:一种水平可扩展的解决方案,用于异步执行微流。请尝试一下 Mendix 9并确保与我们分享您的经验。
