项目核心功能简述:
在此之前最好先看下notes、plan目录下的txt文件
本项目是一个自己臆想出需求(当然,大部分以课程设计文档需求为主)的大学快递代拿服务系统,
后端使用了springboot,mybatis-plus,redis(含lua),rocketmq等进行功能开发实现。
除此之外也整合了nacos,sentinel实现了简单的微服务
至于前端,本人前端水平有限,只能使用老一套的jq,bootstrap实现
参考我的博客
一个大坑就是rocketmq,我是现学现用的,曾因为理论不完善而导致代码多次出现大改,
1.1. 主要坑有两个,一个两阶段提交如何确保事务最终一致性(其实就是这学期nosql的理论实践)
1.2. 还有就是消息可能会重复发送,要保证业务更改操作前查询的的幂等性
还有一个就是redis要主要的点,lua脚本虽然能保证原子性,但因为redis是单线程io多路复用模型,
所以在执行lua的时候,会阻塞住当前执行lua脚本的redis节点的所有其它读写请求,直到上一个lua脚本执行完成。
注意!!!
上面的的阻塞是指线程处于阻塞状态,并不是指lua产生阻塞时再运行其它命令会阻塞,如果上一个lua还在运行,
那么再执行其它任何读写命令都会出现(error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE
这也就意味着,lua脚本必须不允许出现死锁、且不能是执行时间长的脚本(如果是执行时间比较长的脚本,应该限流+完善容错重试机制)。
还有就是redis的lua脚本特性所衍生出来的长连接/任务超时问题:
如果lua脚本因某种原因导致长时间阻塞,那么就有可能导致分配配送员消息消费失败重试/长连接导致连接丢失
然后重试的消息不断重试还是失败,最终消息积压爆表,可能导致服务雪崩/长连接过多导致新用户无法再连接
对于长连接的解决我自然是用rocketmq解决,毕竟假设在海量数据的情况下,完整的插入事务流程肯定比发送一条事务消息更耗时
至于失败消息积压方面解决的方案就有很多,包括sentinel限流、rocketmq限制消费的线程池等
最近要考试,除了课程设计可能漏掉的功能以外,停止更新
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。