SQl+多服务部署并发访问DB

[b]数据库[/b]
student
id name
001 zhangshan
002 lisi
003 wangw
course
student_id course score
001 语文 80
002 语文 68
003 数学 90
001 数学 38

以上两张表满足外键约束:course.student_id =student.id
1. 用一条SQL语句查出分数在60以下(不及格)的学生姓名及课程。
select s.name,c.course from student s LEFT JOIN course c on c.student_id = s.id where c.score < 60
2. 用一条SQL语句查询考试人数排名前三的课程名称和考试人数
select c.course,count(*) count from course c group by c.course order by count desc limit 0,3;
3. 用一条SQL语句查出各门课程的及格率(及格率:该门课程成绩60分及以上的学生数/考试的总学生数)
select sum(c.score >=60)/count(*) tt1 ,c.course x from course c group by c.course
4. 用一条SQL语句查出选修了4门课程以上且所有课程都及格(成绩60分及以上)的学生姓名。
select s.name from student s where s.id in(select c.student_id from course c group by c.student_id HAVING sum(c.score >= 60)/count(c.course) >=1);


[b]设计方案[/b]

ID 商品ID 仓库ID 仓库库存量 累计卖出量
1 Sku001 Store001 10000 129
2 Sku002 Store001 13000 750

功能性需求:当前store001的多个的商品在做抢购业务,需要您在库存子系统里设计一个库存扣减的服务API给订单子系统使用,当订单创建时,实时调用库存扣减的API,更新库存表的累计卖出量,如果累计卖出量超出仓库库存量,则库存扣减失败。
非功能性要求:
1)库存子系统采用10个节点的集群方式部署,有多个Java进程对外提供库存扣减API,需要解决并发修改数据的脏读和脏写的问题
2)库存扣减API需要实现幂等性,当订单模块多次相同的报文请求库存扣减时,只扣减一次,重复扣减的报文请求返回扣减成功。
3)库存子系统的每1个APP部署节点,需要达到1000TPS的库存扣减的性能要求(1秒内完成1000笔库存扣减)
部署硬件清单:
1) Mysql部署的虚拟机8C 64G 1台
2) java应用部署的虚拟机2C 4G 10台
3) eruka服务发现服务器共用,订单子系统从eruka拿到库存子系统的10个节点的IP地址清单后,采用轮询IP的方式调用库存子系统的API
4) 不能再使用mencache或redis等其他第三方软件
针对以上的要求,请给出库存扣减的服务API的核心设计思想(10分)和API接口定义(10分)及代码实现概要(20分)

多进程更新db是个经典问题,一般采用2种方式
1、row lock :select for update ;update table set saleCount = queryInDbCount + 1;
2、单独一个微服务提供update操作
启动时将表数据缓存到内存,放入map中,每次都从缓存去比对更新
再起一个线程去轮询 定时批量更新 saleCount = queryInDbCount + 增量
注意库存快满的时候细节处理

订单模块多次相同请求 主要是注意这个看负载服务是否对同一个来源的ip调用同一个子系统处理

tps比较 这个需要性能测试比较 现有服务器性能情况下 哪种更优
个人预估:db单独提供库存服务表简单事务服务下,第一种形式db加锁,8c的机器性能足够胜任,性能更优的话 第二种应该更好
参考url
[url]https://www.cnblogs.com/micrari/p/8029710.html[/url]
[url]https://www.cnblogs.com/sdgf/p/5740998.html[/url]

你可能感兴趣的:(技术点滴,技术研究,微服务,多进程,并发,sql)