使用具有azure功能的azure服务总线进行ERP订单导入的最佳方法



在下面描述的场景中,我需要一些关于如何将Azure功能与Azure服务总线结合使用的第二意见和指导。编码不是问题,而是选择最合适的方法。遗憾的是,我在网上没有找到任何好的例子,所以现在我正在寻求帮助。

场景

我有一个电子商务客户,他每天向ERP系统发送几千个订单。正常的日常运营不是问题,但我们希望使解决方案更加稳健,以应对例如"黑色星期五"的激增。目前,在数据库满之前,该网站可以容纳x笔订单,并被迫关闭或向下游发送订单。目前,网站将订单直接发送到ERP系统中,正是这一部分,我想与Azure Server总线队列解耦。通过这种解耦,我们可以继续将新订单推到队列中,并在ERP中以自己的速度消耗这些订单,而不会淹没任何系统。

我对如何设置的想法

  1. 网站可以直接向服务总线队列发送消息。Azure功能绑定为队列中的每一条新消息触发,并将该消息发送到ERP系统。

  2. 与上面相同,但是网站首先向Azure功能发送消息,该功能将其放入队列。

  3. 网站会像第1点或第2点那样向队列发送消息。我们设置了一个调度函数,而不是将函数绑定到队列。该功能将频繁运行,每次运行向ERP系统发送1条消息。

  4. 网站会像第1点或第2点那样向队列发送消息。在这里,我们不向ERP系统发送消息,而是由ERP系统读取队列。不喜欢这种方法,但它可以做到,而且易于ERP用户管理。

问题

  • 如果我同意上面的第1点或第2点,负责向ERP系统传递消息的功能是否应该在每个触发器中发送1个或多个订单
  • 如果我采用第1点或第2点,那么仍然有可能淹没ERP系统,因为它们很可能在投入的同时触发
  • 如果ERP系统关闭,队列增加,我是否需要一个单独的调度功能来处理队列,直到它变空

我们不必在这里讨论死信队列,这是另一个主题。

你会如何处理这个问题,或者如果你已经做了类似的解决方案,你使用了什么方法?

非常感谢您的指导!

在过去几年中,我们通过使用Azure功能和服务总线来解决您上面提到的类似场景,学到了很多。你肯定走在了正确的轨道上,想要在激增的情况下脱钩。为了让您对使用Azure Service Bus的选择感到安心,我们通常每分钟通过我们的主题和订阅推送数百个事件,而且效果很好。

让我分享一下我们学到的一些教训:

  1. 同一秒内并发的传入请求数是我们的转折点之一。网站书写正确将很容易适应多个传入请求,但我们了解到关于与出站web请求相关的"端口耗尽"Azure功能。查看您的web客户端的范围和使用寿命您的应用程序服务计划/web服务器的限制
  2. 如果您选择使用Azure功能的消费计划,请意识到有时需要很长时间才能开始。不管是什么点击该函数将不得不实现重试(可能是一个好的无论如何都要练习)
  3. 服务总线消息有大小限制(可以增加,但是仍然存在限制)。我们随机用一个有效载荷击中它其中包含大量信息。了解最坏的情况您可能遇到的有效负载大小
  4. 如果出现问题消息,没有简单的方法可以查询队列中的内容那里确保你对此很满意,否则请考虑对可查询的数据库进行快速写入
  5. Azure功能可以由服务总线触发,并且可以派生代码的多次并发执行(这是所需的),以及有限制。请注意代码的任何限制,以更新您的ERP。您将无法控制服务总线触发器
  6. 注意函数的存储帐户,函数相同的名称将有其触发器设置和锁定彼此(dev与prod环境)
  7. 与Azure服务总线的连接有时会失败,只是托管在云中的服务的性质。这种情况只发生几次并在几秒钟后恢复

考虑这样做:

网站->Azure API管理网关->Azure功能A->服务总线->AzureFunction B->ERP

  1. 启用了AppInsights的Azure API管理是一个很好的额外层,允许您保护、监视和路由到功能a。在您需要将传入请求路由到某个紧急存储桶的情况下,这是一个救命稻草。

  2. 考虑允许函数1接受一个项目数组。启用AppInsights,添加遥测代码,提供订单吞吐量预览。

  3. 功能B具有可配置的定时器触发器和一些应用程序配置,用于处理队列中的消息数量。允许您限制到ERP的数据流。这可能是有争议的,因为你无法用多个实例来扩展这个函数,但我认为最初的关注点是控制速度。还启用相同的AppInsights、遥测、日志记录等

我希望我不会因此受到太多批评。我们从艰难的道路上学到了东西,并最终从Azure架构师和工程师那里得到了一些非常好的指导。

最新更新