继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

从java电商小白到秒杀大咖

2019-05-13 22:45:1213375浏览

龙虾三少

4实战 · 7手记 · 5推荐
TA的实战

前言

       刚从事java开发的同学很多时间会直接接触一些简单的ssm框架,使用spring mvc外加mybatis实现一个基本的web项目,打个war包部署上线。跟上时代潮流的会使用spring boot直接拉上内置tomcat jar包部署方式上手实现,但却忽略了要想从一名普通的码农程序员升级为一名架构师,对于电商或者其它稍微复杂一点的大型项目,在研发的过程中除了要搞定需求,更多的还需要以领域模型为前提的思维方式划分清楚业务模块,业务模型,并在操作的过程中注重扩展性,性能,流量承载,服务降级等策略

业务分层

       我们在做系统设计时需要遵从领域模型的分层设计思想,如下图

https://img2.mukewang.com/5cd950230001f0d108010397.jpg

   
    数据层处理数据库的数据模型,如同与数据库的映射,完全遵从数据库的结构字段。

    业务层处理核心的领域模型,拥有对象的生命周期,例如一个电商的商品Item具有商品的领域模型特征,并且拥有创建,更新,查询到删除的完整生命周期。

    接入层视图模型处理面向ui界面的查询模型,与ui前端对接,提升查询和交互效率。


性能优化

    在完成了闭环的业务数据设计后就需要考虑系统的性能问题。平时我们大部分java程序员都是采用spring加mybatis的框架做数据的crud存取,没有考虑扩展问题和缓存问题。

    首先我们要考虑容器级别的优化,我们的tomcat使用了什么样的线程池配置,和客户端是否采用了keepalive的链接,过载保护后的拒绝策略是什么样的,核心线程在idle状态下需要维持多久保证可以扛住洪峰流量?

    然后我们的系统需要考虑到水平扩展性,单台机器的容量肯定无法扛住所有的压力,我们要考虑我们的系统是否支持无状态部署,所谓的无状态就是没有什么配置或者数据是依赖于应用服务器的,这样才能做到我们可以无脑添加机器。在机器得到扩展后需要有统一的存储来支持数据的访问,分布式的redis会话就可以用来解决数据会话问题。数据库的单点问题也是可以用对应的集中式管理策略来解决

    之后当我们面临查询压力时,我们需要考虑使用多级缓存策略解决问题。怎么确保多级缓存可以有效的保障我们的系统,怎么忍受对应的脏读问题。都是需要我们在做系统设计性能优化中需要解决的。最简单的我们可以使用集中式的redis缓存方案解决问题,由于redis支持很好的cluster分片集群模式,其本身又是可以水平扩展的,当redis的网络及内存消耗不能满足我们的热点数据访问时,我们可以使用本地自身实现lru策略的cache缓存,并控制好总容量以及提供快速的响应,并且可以将对应的热点缓存逐步靠近用户,例如可以迁移到nginx甚至于cdn上以求快速的响应用户请求。

    在面临交易压力的时候,由于交易的所有行为都依赖数据库的落地数据确保正确性,因此我们除了做一些数据库的锁级别的优化外,针对库存这类热点数据还可以借助缓冲等方式做实现,但一旦使用了非落地的数据做交易流程,就必须确保数据的最终一致性避免超卖,超发之类的事件发生,因此通常我们会设计分布式的最终一致性事务方案解决问题。

    优化了这些能力之后,我们需要知道,再厉害的系统也经不住中国十几亿人口的同时访问,因此针对过载保护,限流令牌之类的流量削峰平滑操作措施是必不可少的,同时我们也需要知道并不是所有的流量都是正常的流量,有绝大部分的可能是你的流量都是羊毛党刷的,他们不但影响了正常用户的使用,更可能对你的系统造成致命的打击,因此识别羊毛党,防刷等操作必须是我们要面临承担的问题解决。

总结

    没有最牛的系统,只有最合理的业务架构设计,因此在我们学习并掌握了业务建模和容量提升的基本方法后,我们需要结合电商业务的发展实际去设计系统,解决问题。

·················

欢迎关注课程:《Java电商秒杀系统深度优化 从容应对亿级流量挑战》

打开App,阅读手记
51人推荐
发表评论
随时随地看视频慕课网APP

热门评论

慕课网最喜欢的一个老师,在群里不管什么样的问题都给我们耐心解答?

课程没有群吗?为什么没有看到。还有课程资料在哪里下载?

慕课网最喜欢的一个老师,在群里不管什么样的问题都给我们耐心解答?

查看全部评论