问题梳理
1. 项目中有哪些难点、挑战
难点:设备的命令的不确定性;设备的不稳定性。比如开门不发指令,心跳的自我保护机制
难点:设备的一些网络状态、命令的不稳定性
2. 发出一个开门指令,它不回复我们门是开的还是关的
多次查询,如果多次都没有结果,把订单的仓门状态设置为异常,并通知运营人员。
3. 把门打开,拿了一个东西,放进去一个相同重量的东西
补货员补货的时候发现有不属于我们的商品,把这个仓门这段时间所有订单拿出来核对,并通过监控探头核实。
金额小就打电话,金额大就报名。
有的是视觉柜,可以规避这种风险,但设备成本较高。
4. 从1货道拿了商品后不想买了,放回2货道
- 首先,肯定是会扣钱的,因为1货道的重量减轻了
- 那2货道,如果一个订单完成后一个货道的重量大幅增加,那我们就会把这个货道报警,通知运营人员去现场看一下,或通过摄像头看一下;或者客户自己发现没拿东西扣款了,会去我们的平台申诉。根据客户提供的照片信息,和缓存的重量信息,摄像头,考虑是否对其退款
5. 自我保护机制,项目上下线
6. 有用到RocketMQ吗?
- 通信服务 通过 消息队列 和其他外部服务进行信息交互,没有接口的提供,只有接收消息、发送消息跟其他服务进行交互
- 关门 设备服务 收到商品详情的时候,通过消息队列发送给账户服务去结单,另外一个发送给设备服务的补货 通知它补货
- 所有发短信,就是发送短信通知运营人员校准或者补货,发短信通过通道服务的消息队列去发送短信
7. 哪里用到Redis
-
用Redis做缓存,缓存设备信息
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0TPODXN-1685621626840)(C:\Users\Chen_Zhuo\AppData\Roaming\Typora\typora-user-images\image-20230529234502902.png)]
-
开仓门下单的时候,利用Redis做分布式锁。同时补货、换品也用的是这同一把锁
-
reddision 框架 ,watch dog机制
-
存阿里的APPKey和项目的配置信息
-
通道服务连的哪些设备
- 通道服务id sn1 sn2 sn3
8.哪里用到了分布式事务?
-
分为强一致性 和 最终一致性
-
app创建用户下单信息 --> 账户服务创建账户信息(Seata AT)模式
-
最终一致性,结单的时候(RocketMQ的事务消息)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gy7Q2qNK-1685621626842)(C:\Users\Chen_Zhuo\AppData\Roaming\Typora\typora-user-images\image-20230530220650720.png)]
9.对账
如果一个 客户拿了东西,我们却没扣钱;
-
过去,只会在补货的时候运营人员才会发现;
-
每天 晚上12点,或者交易量小的时候,凌晨1点也好2点也好;
-
去比较一下,每90s上传一次重量,最新的总重量去除以最新的单重=最新的库存,和数据库中的现有库存进行对比
如果是对的就没问题,如果对不上,通过之前重量更改的信息,然后打电话给客户 能不能把钱补上,如果对方不补就算亏损。
10.支付宝结单回调保证幂等性
-
因为是免密支付,支付宝是不会告诉我们支付失败的,
-
2笔只收到成功,就用分布式锁
-
先收到成功,再收到失败,就会报警
11.预授权幂等性
- 授权中才会授权成功
12. 有没有做分库分表
- 做了
- 重量记录30s记录一次
- 只记录4张表,一个星期存一张
13.支付宝和微信 有啥区别?
14. JVM调优
- 做过。
- 最初通信服务100台,新生代 老年代
- 后来通信设备越来越多,到了600台,持续发心跳 导致新生代的Eden区 压力越来越大
- CPU处理速度变慢
- 或导致频繁的full GC
- 怎么解决?
- 首先把每个通信服务我们最多让它连接300台~500台设备,新增的设备连到新的通信服务上。
- 通信服务做了集群,一共4~5台,缓存记录了每台设备连接的是哪些通信服务
- 正常情况下,老年代 : 新生代 = 2:1 将其调成 老年代:新生代 = 1:1
- 再将新生代的 Eden : Survivor : Survivor = 8 : 1 : 1 改成 Eden : Survivor : Survivor = 3 : 1 : 1
大部分的JVM调优,都是调堆里面的新生代和老年代的比例,还有新生代 Eden区和Survivor区的比例。还有一个就是大对象的阈值。
15.哪里会取消订单
- 在1分钟之内用户免密支付未授权
- 门未开(门未响应、异常)