背景
rabbitMQ作为一个功能强大的开源消息队列中间件,它具有一系列的优点和一些限制。优点在于他的持久化消息的机制,以及灵活的消息路由机制等。由于之前订单模块处理使用的rabbitMQ,我们发现会投入很多人力运维,包括配置交换机、队列,绑定路由等。所以我们考虑在基于现有异步架构的情况下,使用数据库+协程处理方式作为新订单模块处理方法。减少多余资源的投入,做到功能精巧和可定制化业务扩展。
方案设计思路
首先订单消息通过api接口方式传递给后端处理,可以提高订单处理的效率,将订单保存在数据库中,也便于后续对账和运维维护。
任务队列分成三类。1.任务处理队列 2.获取任务处理结果队列 3. 更新资源时间队列。
1) 任务处理队列。
开发人员可以根据每个订单资源的不同特性,开发定制不同的任务处理队列来处理订单消息。首先在配置文件中要定制一个任务处理队列task_interval,需要配置好队列名称,处理时间间隔,处理超时时间,处理资源的类型和资源的处理方式。
然后我们需要在代码中定义不同类型和不同资源处理方式的类方法。
- 根据任务处理时间间隔,定时去数据库拉取待处理订单,并标记订单在处理中;
- 开发人员可在类方法中根据资源特性定义不同的处理逻辑。并将整合好的订单参数下发到底层做业务逻辑开通和变更等操作。
- 如果处理失败,修改订单状态为待处理,并标记处理次数,以便重复执行订单任务,当重复处理次数超过配置,订单标记为处理失败,并触发邮箱和短信告警通知,以便运维及时介入。
- 如果处理成功,修改订单状态为已成功。
2) 获取任务处理结果的队列。
- 通过拉取订单状态为已成功的数据来回单,通知订单中心已完成订单。
- 通过拉取处理失败的资源,触发邮箱和短信告警,通知运维人员介入处理。
3) 更新资源时间队列。
在回单成功之后,会再次通过api接口的方式将资源的时间信息同步到数据库中,并修改订单标记is_handle为1(默认是0)。
我们可以根据拉取订单状态为已成功并且is_handle为1的资源执行时间与订单所创建的实例进行绑定操作。如果执行成功修改is_handle为2,即完成订单周期流程。如果执行失败,标记订单状态为更新时间失败,并触发邮箱和短信告警,通知运维人员介入处理。
SD-WAN订单特点
由于SD-WAN的产品需要线下装维,所以客户从下单到使用有有一定的时间。然而这个时间并不能 算到客户使用时间里,从客户体验上不人性化。
因此我们在收到订单之后,需要先派发装维工单,由装维人员进行装维。装维完成之后,才可以触发订单回单操作。所以在回单操作之前,我们需要先拦截订单,将订单状态改为已分发。
装维人员在装维完成之后,有以下三种方式触发回单操作。
- 立即回单,即装维人员触发立即回单操作,订单开始计费。
- 默认设备激活之后5天回单。装维人员不需点击操作立即回单,由定时任务根据激活时间判断回单时间。
- 按指定日期回单。需要装维人员和客户商量具体起租时间,然后配置指定日期回单,由定时任务根据指定回单日期来回单。
以上三种方式可以由装维人员根据客户特点进行选择。