我正在寻找一种好的策略来真正解耦我的 Web 应用程序 (ASP.NET MVC/C#) 的非立即进程,以进行并行处理。我将非立即定义为不需要立即完成以呈现页面或更新信息的所有事情。
这些过程包括发送电子邮件、根据数据库信息更新一些内部统计数据、从仅需要定期执行的网络服务获取外部信息等等。
不过,主 ASP.NET MVC 应用程序和后台任务之间需要存在一些通信;例如MVC 应用程序需要通知电子邮件进程发送一些内容。
做到这一点的最佳策略是什么? MSMQ?将所有那些非即时进程变成Windows服务?我正在想象一个真正解耦的场景,但我不希望进行权衡,使故障排除/单元测试变得更加困难或引入大量代码。
谢谢你!
不能代表 ASP.NET,因为我主要使用 Python 工作,但是...幸运的是我可以回答这个问题,因为它更多的是一个元语言问题。
我通常使用独立运行的基于队列的后端守护进程来完成此操作。当您需要向队列中添加某些内容时,您可以使用您选择的方法(我偏爱 HTTP)进行 IPC 并交付作业。守护进程只是一项一项地完成工作——可能将它们委托给工作线程本身。您可以脱离应用程序的 RESTful 端,并将作业发送到后端,即:
# In frontend (sorry for Python, should be clear)
...
backend_do_request("http://loadbalancer:7124/ipc", my_job)
...
# In backend (psuedoPython)
while 1:
job = wait_for_request()
myqueue.append(job)
...
def workerthread():
job = myqueue.pop()
do_job(job)
如果您稍后需要检查后台守护程序并询问“2025 年工作完成了吗?”您可以在设计中考虑到这一点。
如果您想使用 Windows 服务来做到这一点,我想您可以。它所需要做的就是在您选择的端口上侦听您想要执行的任何 IPC - 我会坚持使用网络传输,因为本地 IPC 将假定为同一台机器并限制您的可扩展性。你的单元测试不应该那么困难;您可以将前端和后端视为两个不同的项目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)