神领物流运单服务业务流程以及相关面试点

ops/2024/11/24 4:34:04/

运单服务

在该服务中用到了什么技术 --> 美团Leaf

什么是美团Leaf

美团Leaf是有美团开源的 , 用于处理分布式环境中保证ID的唯一性 , 通过该技术能够实现Id的全局唯一性 , 高可用性 , 趋势递增性以及容灾性.

美团leaf主要通过两种方式实现业务

  1. 雪花算法

该方式区别于传统的雪花算法 , 通过Zookeeper避免传统模式对时间戳的强依赖

  1. 号段模式

该模式通过数据库来实现字段的趋势递增与唯一性 , 但是区别于传统递增方案 , 美团Leaf通过缓存的方式大大减少对数据库的访问压力 , 并通过双buffer机制 , 提高容灾性避免突刺情况发生

概述调度服务是做什么的

调度服务是在快递员揽收快件之后 , 通过rabbitMQ接受快递员端发送的信息 , 通过订单生成运单并对相同路线的运单进行合并 , 放入相同队列中;

一. 订单是如何生成运单的?

  • 幂等性校验
  • 参数校验
  • 唯一ID生成
  • 路线查询
  • 相同网点运单处理

二. 如何实现相同路线运单的合并

调度中心接收到运单消息后 , 判断运单的当前节点与下一个节点位置 , 通过指定前缀与两个节点ID拼接作为键 , 使用redis的list结构作为队列(从左插入 , 从右取出) , 同时按照相同模式运用set结构存储一份运单ID的信息队列用于幂等性判断

ps: 这里的运单合并并非采用全轨迹的合并 , 而是每次调度只针对当前节点与下个节点相同的运单进行合并 , 在该运输完毕后会重新更具节点信息规划调度任务

三. 调度中心的作用是什么

  • 推动运单流转
  • 调度车辆运输
  • 分配快递员取派件
推动运单流转

当运单生成或者说某运单到达一个节点后都会通过RabbitMQ发送消息给调度中心 , 调度中心接搜到消息后会对运单进行处理 , 放入运输队列 , 推动物流进一步流转

调度车辆运输

调度中心会通过xxljob定时查询当前的空闲车辆分配运输任务

四. 运单有哪些核心字段

  • 运单ID --> SL+十三位数字(通过美团Leaf生成)
  • 当前节点
  • 下一节点
  • 运输路线
  • 货物信息

你们的运单号是怎么生成的?如何确保性能?

由于快件运单号有其特殊的构成 , 如顺风(SL+13位数字) , 所以在我们的项目中也采取该种格式

但市场上现有的唯一ID方案并不能满足无码的需求 , 如UUID包含字母,而雪花算法需要19位都不满足 , 因此我们采用了美团Leaf组件生成唯一ID

美团Leaf是有美团开源的 , 用于处理分布式环境中保证ID的唯一性 , 通过该技术能够实现Id的全局唯一性 , 高可用性 , 趋势递增性以及容灾性.

美团leaf主要通过两种方式实现业务

  1. 雪花算法

该方式区别于传统的雪花算法 , 通过Zookeeper避免传统模式对时间戳的强依赖

  1. 号段模式

该模式通过数据库来实现字段的趋势递增与唯一性 , 但是区别于传统递增方案 , 美团Leaf通过缓存的方式大大减少对数据库的访问压力 , 并通过双buffer机制 , 提高容灾性避免突刺情况发生

双buffer机制:

假如我们设置的号段长度为1000 , 那么该机制就会取号段长度的10%作为阈值 , 一单达到该临界点就会调用一个异步线程再次生成1000的号段 . 在该机制的保护下就不会发生当号段被全部消耗完需要再次从数据库查询而造成延迟现象

能说一下订单转运单的业务逻辑吗?生成运单后如何与调度中心整合在一起的?

在快递员接收到用户快件后 , 在快递员端点击接受 , 就会发送消息给运单所在服务 , 接受到该消息后就会通过订单数据生成运单 , 具体流程如下

  1. 幂等性判断

    因为订单与运单是一一对应关系 , 即一个订单只能生成一个运单 . 所以我们可以通过该关系使用订单号去运单表中查询判断是否已经存在 , 由此校验幂等性

  2. 通过传入的订单查询订单数据并对数据就行校验

  3. 通过美团Leaf生成运单ID

  4. 通过订单起始位置调用路线规划服务生成运输路线

  5. 封装所有数据保存运单

  6. 发送消息给调度中心处理运单调度

合并运单为什么使用Redis的List作为队列?如何确保消息的幂等性的?

合并运单为什么使用Redis的List作为队列?

  1. 使用redis作为队列可以避免集群环境中内存无法共享的问题
  2. Redis的List结构支持有方向存取数据 , 可以保证数据先后顺序

如何确保消息的幂等性的?

因为订单与运单是一一对应关系 , 即一个订单只能生成一个运单 . 所以我们可以通过该关系使用订单号去运单表中查询判断是否已经存在 , 由此校验幂等性


http://www.ppmy.cn/ops/136233.html

相关文章

VB.Net笔记-更新ing

目录 1.1 设置默认VS的开发环境为VB.NET(2024/11/18) 1.2 新建一个“Hello,world”的窗体(2024/11/18) 1.3 计算圆面积的小程序(2024/11/18) 显示/隐式 声明 (2024/11/18&…

React-自定义Hook与逻辑共享

#题引:我认为跟着官方文档学习不会走歪路 在 React 中,自定义 Hook 是一种复用逻辑的方式。自定义 Hook 是一个 JavaScript 函数,名称以 use 开头,可以调用其他的 Hook, 可以返回任意值。 创建自定义Hook 假设你正在开发一款重…

MATLAB 2024a安装包下载及安装教程

[安装环境]: Win 11/Win 10 MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等。MATLAB的基本数据单位是矩阵,它的指令表达式与数学…

MySQL深度剖析-全局锁、表锁、行锁

一、锁的基本概念 事务与锁是不同的。事务具有ACID( 原子性、一致性、隔离性和持久性),锁是用于解决隔离性的一种机制。事务的隔离级别通过锁的机制来实现。 锁机制是为了解决数据库的并发控制问题而产生的。如在同一时刻,客户端对同一个表做更新或查询…

elasticsearch介绍和部署

1 elasticsearch介绍 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。可以很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsea…

Dubbo HTTP接入之triple协议

在 triple协议规范 中我们曾详细介绍了 triple 对于浏览器、网关的友好性设计,其中非常重要的一点是 triple 同时支持跑在 HTTP/1、HTTP/2 上: 在后端服务之间使用高效的 triple 二进制协议。对于前端接入层,则支持所有标准 HTTP 工具如 cUR…

unity3d——基础篇2刷(三角函数练习题)

1. 移动速度和变化速度 面朝向移动速度 (moveSpeed): 控制对象沿其当前朝向(通常是摄像机方向)的移动速度。左右曲线移动变化的速度 (changeSpeed): 控制对象左右移动速度的变化频率。 2. 移动距离控制 左右曲线移动距离控制 (changeSize): 控制对象左…

『 Linux 』网络层 - IP协议(一)

文章目录 IP协议报文格式IP协议报文如何进行报头与有效载荷分离 网段划分CIDR特殊的IP地址 IP地址的数量限制私有IP和公网IP理解运营商 IP协议报文格式 IP协议报文格式与TCP协议的报文格式类似; IP报文的宽度也是32位; 对应的IP的实际报头为20字节为定长报头(固定长度); 版本 …