当前位置: 首页 > news >正文

标签派单系统架构设计

需求描述

项目背景

  1. 根据员工历史成单情况,计算员工对不同类型工单的转化能力。
  2. 根据员工和工单标签匹配进行派单。

业务流程图

规则描述

每10分钟,分城进行一次派单,派单规则可能会动态删减,需要支持动态配置

工单标签说明

一级标签二级标签
客户性别男>女
客户性格温和>冷漠>急躁
客户属性严谨>社会
客户年龄20+> 30+> 40+> 50+> 60+
客户学历初中> 高中> 大专> 大学> 硕士> 博士

员工标签计算方式

  1. BI每月统计员工标签
  2. 员工历史成单情况,每个二级标签排名前40%的人,会有该标签
  3. 每个员工,一级标签,自排序,取第一个,例如: 性别一级标签, 张三,接女性的单,大于男性,就给张三,服务女性标签

派单规则

工单类过滤,都满足才通过

  • 工单时效性, 工单超时判断
  • 工单合法性,工单是否是未派单状态

员工类过滤:都满足才通过

  • 员工,日/月工单上限
  • 员工,开工状态校验
  • 门店,日/月工单上限
  • 员工,工单价值匹配
  • 等10余条规则

排序: 员工接单量排序

架构设计

明确需求,找出复杂度

需求描述基本满足编码要求,但是对于架构设计,还是不够的。还需依据需求,多次沟通,判断质量复杂度,业务复杂度

业务复杂度方面,规则多,逻辑多,且未来2年内变化较大,业务复杂度较高。

质量复杂度方面(高性能,高可用,成本,安全等),需要与产品尽可能沟通,明确。

首先关注的是业务量,业务量越大,对高性能要求越大。历史数据表明,日均1W单。最高1min 200单,属于高性能要求较低

其次关注业务容忍度,影响高可用,公司规定派单系业务故障时间不能超过1min

然后关注成本部分,公司没有特殊要求

最后考虑,安全等问题,这需求不涉及法律法规,公司规定,这里忽略。

通盘考虑,可以判断出, 标签派单系统, 业务复杂度高,质量复杂度较低

根据设计复杂度模型,找出大致架构设计方向

设计复杂度模型

组内人员介绍,派单组3个人,都是java后端开发,公司以由完善的微服务架构

根据复杂度判断结果,依据设计复杂度模型,考虑组内人员情况,公司架构情况,得出架构大致方向:

可扩展方面: 采用微服务架构

高性能,高可用方面: 采用集群+负载均衡

拆解,取舍,细化架构

可扩展设计

架构可扩展设计

微服务拆分,理论上:

  -  3个人维护一个迭代中的系统,1个人维护3个处于维护期的系统。-  一次调用不超过5个系统

但是考虑到派单,规则变化较大,封装变化,适度扩展。

拆分的微服务如下:

  • receive_wait_order 接受待派工单, 分城查询待派工单,开发后基本不变
  • dispatch 派单,变化较大
  • score 员工标签配置服务,开发后基本不变。
  • record 记录派单结果,事实统计,为报表提供底层数据

代码可扩展设计

派单系统,规则多,未来变化大,这里采用规则引擎,降低复杂度。

规则引擎对比

规则引擎优点缺点
drools成熟度高,大公司开发需要花时间掌握,成本高
liteFlow支持,多种逻辑关系,xml或yml配置,支持配置中心热更新,掌握成本低没有界面,需要xml等配置
ice支持,多种逻辑关系,有精美界面单独部署,如果二次开发,需要前端技能

结合团队情况 ,大家都是Java后端开发,公司已有配置中心,根据 合适,简单,演进 原则,选择liteFlow,结合已有配置中心。

高性能,高可用设计

日均1W单。最高1min 200单,一次派单预计0.8s,业务需求每10分钟按城市派1轮,推导出,性能要求不高,可接受一定时延,不超过10min分钟

采用任务分解模式,按城市分片

利用已有消息队列kafka,receive_wait_order 每10分钟发送派单消息, 消息体为:需要派单的城市

一次派单预计耗时0.8s,单台dispatch 派单QPS 1.25, 3台dispatch QPM 225,满足业务需求

3台dispatch 同一个消费组进行消费,来实现按城市分片派单。

其他服务没有高性能要求,但又高可用要求,均选择2台。

存储设计

结构化数据,采用Mysql 存储,大多数表数据量较小,不用特殊处理

但是派单结果表 1天1W单,1年365W ,未来场景考虑, 派单结果表采用 按年分表

分表采用Sharding-JDBC ,SDK嵌入record项目无需考虑高性能,高可用

最终结构图

  • receive_wait_order 接受待派工单, 分城查询待派工单,开发后基本不变
  • dispatch 派单,变化较大
  • score 员工标签配置服务,开发后基本不变
  • record 记录派单结果,事实统计,为报表提供底层数据

业务架构图

系统架构图

相关文章:

标签派单系统架构设计

需求描述 项目背景 根据员工历史成单情况,计算员工对不同类型工单的转化能力。根据员工和工单标签匹配进行派单。 业务流程图 规则描述 每10分钟,分城进行一次派单,派单规则可能会动态删减,需要支持动态配置 工单标签说明 一…...

Jmeter和Postman那个工具更适合做接口测试?

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中,有高手,自然也会有小白,但有一点我们无法否认,就是每一个高手都是从小白开始的,所以今天我们就来谈谈一大部分人在做的接口测试,小白变高手…...

k8s污点与容忍

1.前言 污点是给node节点打上污点标签,使得pod不能往该node节点上调度,污点有三种模式,分别是NoSchedule、PreferNoSchedule、NoExecute,容忍是给pod打上和node节点一样的污点标签,使pod能调度到带有该污点标签的node…...

市面上有哪些软件可以结合agentgpt的?众包平台结合的好处!

使用AgentGPT,提升工作效率! 随着科技的迅速发展,人工智能已经成为我们生活中不可或缺的一部分。而AgentGPT则是人工智能领域的一款杰出产品,它能够帮助我们提升工作效率,减少重复性劳动,让我们的生活更加便…...

【js】对象属性的拦截和Proxy代理与Reflect映射的用法与区别

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录 对象属性的拦截介绍SetGet 对象的拦截介绍使用对象属性拦截和对象拦截区别练习题 映射…...

Yolov8涨点神器:ODConv+ConvNeXt提升小目标检测能力

1.涨点神器结合,助力YOLO 1.1 ICLR 2022涨点神器——即插即用的动态卷积ODConv 论文:Omni-Dimensional Dynamic Convolution 论文地址:Omni-Dimensional Dynamic Convolution | OpenReview ODConv通过并行策略引入一种多维注意力机制以对卷积核空间的四个维度学习更灵活的…...

git代码回滚是使用reset还是revert

时光不能回退,Git却允许我们改变历史。 想要让Git回退历史,有以下步骤: 使用git log命令,查看分支提交历史,确认需要回退的版本 使用git reset --hard commit_id命令,进行版本回退 使用git push origin命…...

深入理解Java ThreadLocal及其内存泄漏防范

文章目录 一、ThreadLocal简介二、ThreadLocal的内存泄漏问题三、防止ThreadLocal导致的内存泄漏四、总结 一、ThreadLocal简介 在Java中,ThreadLocal是一种线程封闭的机制,其主要目的是为每个线程都创建一个单独的变量副本。这意味着,每个线…...

介绍10款ChatGPT替代产品

ChatGPT 引领着聊天 AI 的世界,许多人已经开始在日常生活中使用它。OpenAI 的 GPT-3 语言模型是聊天机器人的基础,它使得用户能够通过回答问题与 AI 进行交互。 GPT-4 的引入为机器人提供了更强大的功能。然而,它也有一个明显的缺点&#xff…...

数字逻辑 期末

概述 教材:《电子技术基础(数字部分)》 第六版 7400系列是TTL型芯片,商用型 数制 十进制->二进制 除2取余法&乘2取整法(注意精度,但计科简单不考) 十六进制->二进制 一位变四位 八…...

MT4交易外汇平台有哪些优势?为何是外汇投资首选?

外汇市场上存在着各种各样的外汇交易商,但是很多的外汇交易商所选择的交易平台都是MT4交易外汇平台。作为全世界范围内使用最为广泛的交易平台,MT4交易外汇平台具有哪些优势,能够让外汇交易商和外汇投资者都选择使用。本文就来具体的聊聊&…...

问卷调查工具实力榜单发布

问卷调查是从目标受众那里收集有价值的反馈和见解的有效方式。正确的调查问卷工具可以使问卷的创建、分发和分析变得更加容易和高效。在本文中,我们将问卷调查工具排行榜实力榜,为大家选择问卷平台的时候提供有价值的参考意见。 1、Zoho Survey Zoho S…...

javascript中property和attribute有什么区别?

在JavaScript中,“property”(属性)和"attribute"(属性)这两个术语用于描述对象的特性,但它们在含义和用法上有一些区别。 1、属性(Properties): 属性是属于J…...

快速上手kettle

一、前言 最近由于工作需要,需要用到kettle工具进行数据迁移转换。特意找资料学习了一下,kettle基本操作算是学会了。 所学的也结合实际工作进行了验证。为了防止以后用到忘记了,便写了几篇文章记录一下。 二 、ETL简介 ETL ( Extract-Tran…...

Leetcode 399. 除法求值

Leetcode 399. 除法求值题目 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个Ai 或 Bi 是一个表示单个变量的字符串。另有一些以数组 queries 表示的问题&am…...

kotlin协程并发/并行与串行互相切换,CoroutineScope与await

kotlin协程并发/并行与串行互相切换,CoroutineScope与await import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.time.LocalTimefun main(args: Arra…...

初识linux之简单了解TCP协议与UDP协议

目录 一、理解源IP地址和目的IP地址 二、端口号 1. 为什么要有端口号 2. 理解端口号 3. 源端口号和目的端口号 三、初步了解TCP协议和UDP协议 1. 初步认识TCP协议 2. 初步认识UDP协议 3. 可靠传输与不可靠传输 四、网络字节序 1. 网络字节序的概念 2. 如何形成网络…...

【String——简单使用】

文章目录 String1. 字符串定义和初始化2. 字符串基本操作2.1 访问单个字符2.2 修改字符串内容2.3 字符串查找和比较 3. 常用字符串函数3.1 length() 和 size()3.2 empty()3.3 substr()3.4 c_str() 4.字符与整形之间相互转换4.1 char 类型转 int 类型4.2 int 类型转 char 类型4.…...

Python下Taobao封装API接口的优势

Python是一门面向对象编程的语言,封装是面向对象编程中的一种重要概念,它把数据和方法包装在一起,实现了对数据的保护和控制。Python封装接口的优势如下: 1.安全性 封装可以保证数据的安全性,禁止外部对数据的直接访…...

LeetCode 49 字母异位词分组

LeetCode 49 字母异位词分组 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/group-anagrams/description/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给你一个字符串数组&#x…...

( 链表) 142. 环形链表 II——【Leetcode每日一题】

❓142. 环形链表 II 难度:中等 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定…...

论文解读 | 基于改进点对特征的点云6D姿态估计

原创 | 文 BFT机器人 01 摘要 点对特征(PPF)方法已被证明是一种有效的杂波和遮挡下的姿态估计方法。 文章的改进方法主要包括: (1)一种基于奇偶规则求解封闭几何的法向的方法; (2)通过将体素网格划分为等效角度单元的有效降采样方法; (3)基于拟合点的验证步骤。在真实杂波数据集…...

Shell脚本while循环语句应用

记录:433 场景:Shell脚本while循环语句应用。Shell脚本while循环语句应用。while do done、while : do done、while true do done。 版本:CentOS Linux release 7.9.2009。 1.while常用格式 1.1格式一:while do done while c…...

Kubernetes Dashboard + Ingress 及其 yaml 文件分析

概述 记录部署Dashboard Ingress的具体过程及其 yaml 文件分析 Dashboard Yaml # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the Li…...

【SpringCloud组件——Nacos】

前置准备: 分别提供订单系统(OrderService)和用户系统(UserService)。订单系统主要负责订单相关信息的处理,用户系统主要负责用户相关信息的处理。 一、服务注册与发现 1.1、在父工程当中引入Nacos依赖 …...

pinia状态管理 用法

Pinia是一个用于vue的状态管理库,类似于vuex,是vue的另一种状态管理工具。 Pinia 是 Vue 的存储库,它允许跨组件/页面共享状态。实际上,Pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia&am…...

Oracle客户端版本安装

一、版本准备 Oracle版本下载官网:Instant Client for Linux x86-64 (64-bit) | Oracle 中国 进入网站下载对应的oracle版本,通常环境所用的包有:basic、sdk、sdkplus三个包。包的类型分为rpm和zip包,均可以下载,当前…...

基于Android studio二手车交易系统app

客户端: 用户注册:通过输入用户名,密码,所在地,联系地址以及电话和电子邮件等信息进行用户信息的注册。 二手车查看:用户注册登录系统后,可以查看二手车的基本信息,通过二手车的品牌…...

【LCD应用编程】绘制点、线、矩形框

之前获取LCD屏幕参数信息时了解到,LCD屏是 FrameBuffer 设备,操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外,LCD屏上包含多个像素点,绘制点、线、矩形框本质是在修改这些像素点的颜色。 目录 1、定义 lcd_color…...

第八篇、基于Arduino uno,获取MAX30102心率传感器的心率信息——结果导向

0、结果 说明:先来看看串口调试助手显示的结果,第一个值是原始的IR值,第二个值是实时的心跳,第三个值是平均心跳,如果是你想要的,可以接着往下看。 1、外观 说明:MAX30102心率传感器的外观如下…...