解耦(并行处理)Web 应用程序的非立即进程的最佳方法?

2024-03-30

我正在寻找一种好的策略来真正解耦我的 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(使用前将#替换为@)

解耦(并行处理)Web 应用程序的非立即进程的最佳方法? 的相关文章

随机推荐

  • 无法访问生成配置管理器或 Visual C# 2010 Express 中的生成配置

    完整故事 通常 当我安装 Visual C 2010 Express 时 我做的第一件事就是切换到专家设置 这使我可以访问构建配置以及相应的管理器 最近的安装似乎行为不当 我创建的第一个项目是 XNA 4 0 刷新 项目 我导入了一些旧代码
  • Cordova / Ionic - 从 InAppBrowser 下载文件

    场景是这样的 我在InAppBrowser中打开一个网站 用户结束那里的工作后 网站生成一个 pdf供用户下载 问题是pdf没有下载 它在浏览器 有没有办法让它从 InAppBrowser 下载 我目前正在开发一个 iOS 应用程序 因此该
  • Laravel APP_LOCALE 西班牙语

    在 Laravel 5 4 中 env I have APP LOCALE es APP FALLBACK LOCALE en APP LOCALE PHP es US and in config app php locale gt env
  • 如何将数据库路由器添加到 Django 项目

    我正在按照此处有关如何在一个 Django 项目中处理多个数据库的说明进行操作主题 数据库 多数据库 https docs djangoproject com en 2 1 topics db multi db 我已经创建了所需的两个路由器
  • 如何向 UITableViewCell 添加手势?

    我想为每个单元格添加点击手势UITableView编辑其中的内容 添加手势的两种方法是通过代码或通过情节提要 我都尝试过 但都失败了 我可以添加一个手势吗every表格中的单元格带有情节提要拖放功能 它似乎只向第一个单元格添加手势 在代码中
  • 一小时后如何删除本地存储?

    我的数据是对象 我使用本地存储 javascript 保存它 如下所示 localStorage setItem storedData JSON stringify data 我只想保留该数据 1 小时 因此 如果超过 1 小时 数据将被删
  • 将 std::function 绑定到不同对象实例的相同函数

    是否可以重新绑定 std function 以指向相同的函数但具有不同的对象实例 假设我有一个对象 它的 std function 绑定到另一个函数 但如果该对象被复制到另一个实例 我想将 std function 重新绑定到该新实例而不是
  • bash 中双方括号的含义[重复]

    这个问题在这里已经有答案了 At this 凯尔 布 兰特回答中的问题 https serverfault com questions 53577 linux bash syntax meaning of and the 构造被描述为 ba
  • 使用字符串类输入空格时出现 cin 问题

    我有以下代码 main cpp include
  • 如何将字符串/数字附加到字符串?

    我有一个函数 void generateLevelFromPlist int currentLevel NSString mainPath NSBundle mainBundle bundlePath itemPositionPlistLo
  • python,pandas,按条件删除行

    您好 我需要帮助根据条件删除一些行 如果估计价格减去价格超过 1500 正 则删除该行 price estimated price 0 13295 13795 1 19990 22275 2 7295 6498 例如只有索引 1 会被删除
  • 如何在关系中设置主键?

    我想知道如何正确设置主键 in a Relation 例如 我们有ER图其中包含元素 关键属性 关键属性较弱 识别关系 关联实体 为了将其翻译成关系模型我们应该做一些技巧 上面的所有元素都处理关系的主键 但它们都是自然键 这样我们就可以离开
  • 下载 PMC 和 PubMed 数据库中的所有全文文章

    根据 NCBI Help Desk 回答的问题之一 我们无法 批量下载 考研中心 但是 我可以使用 NCBI E utilities 下载吗allPMC 数据库中的全文论文使用Efetch或者至少使用以下命令找到所有相应的 PMCidEse
  • 是否可以使用 jQuery(或其他库)*不*滚动 div ?

    我想以编程方式滚动 divwithout使用任何库 可能吗 如果可能的话 如何实现 谢谢 是的 var myEl document getElementById myEl myEl scrollLeft 12 myEl scrollTop
  • 测试当前目录是否在 Rails 项目内 (bash)

    有没有一种简单的方法来测试当前目录是否在 Rails 项目内 显然 Rails 本身对此进行了测试 以便使用 Rails 子命令 生成 脚手架等 因此大概有一种直接的方法来测试这一点 我正在寻找与您类似的东西测试您是否在 Git 存储库中
  • 如何确定Compact Framework 3.5中dll文件的文件版本[重复]

    这个问题在这里已经有答案了 我想在指定路径时确定 c 中 dll 文件的文件版本 假设 path x y z dll 给定路径时如何查找 z dll 的文件版本 注意 我使用 Compact Framework 3 5 SP1 Get th
  • Bootbox 警报框中的新行

    我想在我的 Bootbox Alert Box 中新建一行 我知道在 Javascript 中你可以使用 n但这似乎不起作用 这是我尝试过的 bootbox alert Hello n world 您可以使用 html 来实现 bootbo
  • printf 中可以使用指向字符串的指针吗?

    我在想这样的事情 include
  • 使用角度材质 2 输入的自定义样式

    我正在尝试设计输入的样式 使其具有一定的宽度 我正在使用 Angular Material 2 但由于某种原因 css 中的样式没有应用于输入标签 这是我的问题的一个工作插件 http plnkr co edit qHbyig0gHtxdq
  • 解耦(并行处理)Web 应用程序的非立即进程的最佳方法?

    我正在寻找一种好的策略来真正解耦我的 Web 应用程序 ASP NET MVC C 的非立即进程 以进行并行处理 我将非立即定义为不需要立即完成以呈现页面或更新信息的所有事情 这些过程包括发送电子邮件 根据数据库信息更新一些内部统计数据 从