对于一个分布式商城系统,或许你可以这样优化一下数据库的设计


1.对于发布商品和交易的总数的时候,数据库的设计:

因为对于发布者发布的总商品和交易的总数,这部分不仅仅只是涉及到用户表,同时也涉及到商品表,那么在我的二手闲置商城中,为了确保系统的性能以及可扩展性,不应该盲目尊崇数据库设计的范式,而是实现数据库表的yonyu字段,使其反范式化

 那么分析一下,第一版我对于商品与用户的表设计时,考虑的是在商品与交易表中实时的通过count去计算我们的商品数,这样在用户界面时查看自己的交易与发布的商品的时候,能够实时的去计算和查看我们的发布的商品总数和交易总数,但是这样也带来了一系列问题,如,当我们用户不断的去发布商品和交易的时候,对于我们的数据库带来的性能压力是极大的,可以想象,当用户的商品积累至万级时,所损耗的性能了,每次访问都需要计算对于初期是可以的,但是并不优雅

​那么我的第二版解决方案是什么呢? 即在用户表中实现插入yonyu字段,将用户发布的商品使用计数器的形式去写入数据表中,这样,我们就可以通过查询用户的字段即可实现读取交易总数和发布商品的总数,但是会出现什么问题呢?每当用户发布一个商品或完成一笔交易,都需要更新 `users` 表中的这个计数字段。这会导致对用户表的高频写入,在高并发下容易产生行锁竞争,影响核心用户服务的性能。

​但是对于我的这个小平台而言,这已经是比较好的一个设计方式了,对于业务增长没有怎么大的情况下,这可以应对1000-2000人的使用。但是,作为一个优雅的程序员,我已经在这部分埋点了,这部分后期我需要去实现第三版优化。具体的优化方式为:

​在深入了解了EDA,RabbitMQ的底层原理,我可以确定的是,我们完全可以去是实现一种读写分离,并且考虑最终一致性的一个设计模式,对于微服务而言,我们并不需要去对商品,用户,订单服务进行额外的增加yonyu字段,而是可以去考虑在用户行为模块中,实现DDD架构中的聚合模式,想象一下,目前我的商品模块在发布商品的时候,已经实现了RabbitMQ的异步发布机制,当然,这部分的商品发布机制对应的只是个性化推荐系统的商品推荐,那么我能不能在用户行为模块中实现一种消费机制,实现用户的发布商品与交易商品的回显呢?当然可以,用户的行为模块是关于收藏,点赞发布评论,这些都是可以实现异步机制的,我们不需要实时的去显示,而是为了考虑最终一致性而设计的。
#技术人#
全部评论
字段计数器的更新,目前采用的方式为RabbitMQ消费这样的一个方式,当商品模块发布的时候,通过实现RabbitMQ的计数器的队列和绑定键的撰写,比如:实现创建商品用户计数器的对垒,将其队列绑定到交换机上,通过撰写事件监听监听从RabbitMQ接收到的用户事件信息以及用户计数器的事件基类,实现幂等控制,实体的设计,创建商品发布事件,创建商品下架事件,创建订单完成事件,创建卖家订单完成事件,然后在此基础上去判定事件的类型,是增加还是减少即可
点赞 回复 分享
发布于 06-07 15:02 美国

相关推荐

06-04 18:37
门头沟学院 Java
我有个97年毕业的双非本科朋友,做Java开发的,今年4月被裁员后经历了挺长一段迷茫期。他休息了半个月调整状态开始找工作,但一直不太顺利,整个人都快自闭了。这段时间他也在不断反思,为什么有的程序员能轻松拿到月薪3-4万的工作,自己却连1.5万以上的面试机会都很少。他总结了几点原因:  1. 之前公司太安逸:几乎不怎么加班,工作节奏很慢。  2. 安逸让人懒惰:时间一长,他思想上也变得懒惰,不想学习新技术,更不愿意跳出舒适圈,结果技术能力逐渐跟不上行业发展的步伐。  3. 大环境不好:这是他觉得最无奈的一点,现在就业市场确实挺严峻的。他有5年工作经验,大厂进不去就不考虑了,但工资挂1.5万以上几乎没什么面试机会。后来他把期望薪资降到了1.3万,虽然有10家公司让他进了二面,但最后都没了下文。当然,期间他也收到过几个offer,但面试时感觉公司氛围不太好,就都没去。现在他特别迷茫,一直在学习新东西提升自己,但也在想,就算找到下一份工作,在这么差的环境下,未来该怎么办?35岁之后,甚至30岁之后,如果再被裁员,难道只能继续找Java程序员的工作吗?他真的很想知道,那些被裁员的前辈们是怎么规划后续职业道路的,或者那些已经迈过35岁大关的勇者们,你们是怎么应对这个问题的?他知道自己现在最紧要的是先找一份本职工作过渡一下,但之后的路该怎么走,他真的很迷茫。有没有前辈能给他提点建议啊?真的特别感谢!   
点赞 评论 收藏
分享
06-07 15:32
已编辑
门头沟学院 Java
timeline 2.18投递  2.27测评 3.1笔试 4.3笔试 4.9技术面 4.14 HR面 4.18oc    和这家公司真的一波三折,我在大三下的时候拿过福州浩鲸的实习offer,但是后来去了另一家公司新意科技所以没去浩鲸(事实证明这个决定是错的,我在去年12月份被新意给裁了,具体细节可以去搜新意科技,有一个帖子详细说了这件事),春招的时候又投了浩鲸,但是没投福州,投了其他地方,怕被福州的HR认出来(可能有人要问了,HR接触这么多人怎么可能记得你?上面提到浩鲸发了实习offer我没去,浩鲸鱼的HR应该认识我们学院领导,和我们学校比较熟悉,居然直接找到院领导问我为什么不去?这件事还是辅导员告诉我的,据辅导员说因为不止我一个人拿了offer不去,所以HR才去问院领导怎么回事),3.1号做完笔试就没消息了。    到了4月份在翻boss直聘的时候看到福州浩鲸又在招聘,我抱着试一试的心态投了简历,结果HR上来就问我去年发了offer为什么不来,我就只能硬着头皮解释,解释完又聊了一些其他的就没消息了,到这我以为又没戏了,结果当天晚上又收到了笔试,笔试内容甚至和3月份的一模一样,做完以后就沟通面试,面完几天就发了offer,至此我以为我的春招会结束,但是我即将尝到大学四年种下的苦果。    由于本人英语比较差,差到什么程度,高中三年英语没及格过,加上大学没花太多时间在英语上,所以导致英语没过四级,但是浩鲸的这个部门要求要过四级,所以就没法入职,offer就作废了(可能有人说你自己没认真看招聘要求,浩鲸开发岗位是有两个部门,一个国际部门,一个国内部门,国内部门是不要求四级的,所以我当时可能就没看清楚就投了,我简历上没写四级,面试的时候也没问,HR估计默认了你应该过了四级,所以导致了这种情况),所以经历这么多波折,最终还是无缘,这只能怪自己,没有重视英语这个东西。不过说实话,很多国央企硬卡四级纯粹就是为了筛人,不是为了证明你英语有多好,你如果工作中对英语真有要求,至少也得六级,或者干脆笔试面试的时候来个英语测试,卡四级纯粹就是为了筛掉大学学习态度不好的那一些人,大学四年四级能考好几次,都考不过确实是态度的问题,没有重视这个东西,所以用我的经历告诉大家,四级这东西还是要想办法过了,不然它会在你意想不到的地方卡你。浩鲸这家公司其实真的还行,薪资在福州算最高一档了,我整个春招其他几个offer的薪资都没浩鲸多,也不断的给我机会,最终无缘也很是遗憾,下面是我的面经----- 笔试笔试很简单,应该是我做过最简单的笔试了,只有选择填空简答,都是基础的东西,你看过一些八股就能做----- 技术面(30min)1.自我介绍2.简历上的两个项目是实习的项目还是学习的项目?3.从简历上的两个项目和实习中做的项目中挑一个项目介绍一下?4.你项目中的Redis用来存什么?为什么用Redis存?5.你项目中的为什么要用责任链模式?6.你项目里进行了压测,在压测过程中发现了什么问题?怎么进行性能优化的?7.你如何理解线程安全?java中怎么保证线程安全?8.mysql事务的特性?索引失效场景?9.对于IOC和AOP的理解?AOP能做什么?你用AOP做过什么?10.java反射的作用?你用过反射吗?11.消息队列的工作原理?如何保证消息不丢失?你项目里是怎么做的?12.如何确保缓存和数据库的一致性?13.java异常类型?----- HR面(45min)HR面问的问题比较宽泛,思维跳跃有点大1.学校在省内的排名2.高考各科的成绩3.根据需求写一个sql语句4.平时的爱好?看小说5.如果开发一个小说网站,你会怎么设计这个网站?从需求分析到系统架构展开讲讲6.思考你刚才方案可能存在的问题----------接下来的问题就有点奇葩了7.一个月生活费多少?够花吗?8.你们宿舍平时一起吃饭吗?有一起出去玩吗?9.会不会唱歌?有去过ktv吗?平时一个人在宿舍会唱歌吗?其他基本都是一些闲聊的东西,记不清楚了
查看22道真题和解析
点赞 评论 收藏
分享
全自动干饭机:今日我若冷眼旁观,他日亦无人为我摇旗呐喊。xd加油!
投递美团等公司7个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务