系统设计
竹木一540
这个作者很懒,什么都没留下…
展开
-
关于抢购的狂想二
我以前讨论过抢购的库存问题,我听到很多人的实现方式是得用redis加上lua实现计数操作。据说redis每秒两万次的操作不成问题。但问题是数据传输也需要时间。我以为能在本地解决就决不通过数据库解决。以下我的一个解决方案,在我看来没有百分百完美的方案,有好就有坏。1.库存表中(或商品表中)设如下字段:剩余数量,锁定数量2.用户下单时,向业务实例申请锁定资源3.业务检查本地实例资源是否够用,如果不够,向数据库申请若干资源(将锁定数量加上申请数量)4.扣除本地资源以下是伪代码class Stock{原创 2020-11-12 12:17:21 · 109 阅读 · 0 评论 -
关于抢购的狂想一
在很久以前,就与别人聊过抢购的设计。一般抢购的第一步是控制抢购的开始时间,只有到达指定时间后,抢购业务才能正常进行。有以下方式可以实现:1.通过Redis或数据库,或zk共享变量2.通过计时实现(每次访问对比系统时间)3.通过消息中间件,加本地变量实现我今天坐公交车,突然想,这些不与业务相关的控制可以交给上游网关去做。在未到达抢购时间之前,前端只访问计时服务器,提供业务负载的ngix不进行路由。已到达抢购时间,nginx更改配置,正常负载到业务服务实例。需要在服务端执行一个定时任务,在到原创 2020-11-10 16:06:22 · 162 阅读 · 0 评论 -
框架搭建自我见
搭建框架不仅是技术选型或编写代码,也是制定一套标准。文章目录前言一、搭建框架概述前言最近和别人聊起技术选型,以及框架搭建,别人经常说,很简单的事情。但我却以为,这其实是一件复杂无比的事。我从没看过有人能把这件事做好,包括我自己在内。我以为搭建框架不仅是技术选型,或编写代码,它也是一套开发规则的制定过程。我打算写几篇文章,从我的工作实践出发,聊聊自己是如何搭建框架的。这可能是一篇很长的文章,我可能会分几篇去写,也可能在此篇的基础上不停地添加新内容PS:我写博客的目的,一是为练练手,二是为了理.原创 2020-11-02 19:29:08 · 164 阅读 · 0 评论 -
创建项目的shell脚本
echo "请输入描述"read descriptioncontent_path=appjava_path=${content_path}/src/main/java/java_resouce_path=${content_path}/src/main/resourcesapplicationPath=${java_path}com/shangqiao56/tms/$subpackage/main_package=com.shangqiao56.tms.${subpackage}r原创 2020-10-30 20:16:51 · 157 阅读 · 0 评论 -
一次犯蠢
今年我参与公司最重要的一件事莫过于网商银行的对接,因为商户注册后过几分钟,网商银行才会给出结果,我方需要反查网商的审核结果,有些类型的交易也是如此,我给出的方案是利用spring自带的定时任务去处理每笔数据,但用定时处理数据,会造成两个恶果:1.频繁查询数据库2.给多机部署带来不便聪明的我,当时想到很多后继解决方案,比如利JUC中的DelayQueue去削减查询数据库的次数。以及在多机部署时,利用对交易id求余,使数据分成多个子集,让每个服务实例单独占用一个数据集。我自认为那是最优的方案了,前不久,原创 2020-10-27 21:45:17 · 112 阅读 · 0 评论 -
Redis一致性方案
尽管到目前为止,我在项目中还没有遇到缓存不一致问题,(遇过一次是因为代码遗漏原因)。就是那次让我考虑缓存不一致的解决方案,网上有很方案,例如加锁,消息队列,或延迟删除,还有监控binlog日志,还有用LUA实现乐观锁,但我一直为这些方案都不是太理想化,要么增加了系统的复杂度,要么不能做到实时一致性。一天我漫步在一个江南水乡的小镇上,我突然奇想,很多方案都是利用串行化的方式,实现缓存一致性。那我为什么不能利用数据库的特性去实现呢?于是有了以下方案:首先关系数据库中对同一记录写与写之间是互斥的,这表示一个写事原创 2020-10-26 14:22:31 · 181 阅读 · 0 评论 -
回忆多年前与C程序员共事后的总结
我曾在某大型项目组与某些高端人事共事(当然我只是个外包),从代码变量命名上可以看出,对方是做C出身,半路出家,转JAVA,除了用下划线命名之外,做C的程序员在很多细节上表现与JAVA的编程习惯不一致。不善长利用异常c语言中经常出现这样的代码/***返回:1代表成功,0代表失败***/int do_some_thing(int i ){ ....}int stat = do_some_thing(int i);if(!stat){}c语言或者像Go这样的语言中,函数经常返原创 2020-10-22 13:20:09 · 182 阅读 · 0 评论 -
闲聊kafka
在南京时,公司的boss系统(电信的短信系统)要与第三系统对接,第三方用的是php,并非java技术栈。分布式系统当时还没这么吃香。那时能想到的最好解决方案就是共用同一数据库。当系我方统接收到一条短信时,向短信表中插入一条数据。而第三方系统利用另一张表,记录最后他们处理短信的id,因为id是递增的,因此第三方系统就可以获获取增量数据了。这种通过共享数据实现的系统现在看起来虽然有那么点……。但我自认为在当时是最好的架构了。其实kafka和我上面的模型何其相似,同样用到了递增特性,同样设制一个offse原创 2020-10-20 20:08:30 · 245 阅读 · 0 评论 -
code review总结
文章目录前言一.error日志二 装箱与拆箱三 没完没了的字符串四 过多的嵌套五 乱拷贝六 引用了不该引用的jar包。前言一六年,我参与了一个我有生以来的最高大尚的项目,我在项目中负责某功能计费模块的开发,尽管总个项目投入了很多人力,还有引进了很多先进的工具和管理方式,但那还是我有生以来见过最糟的项目之一一七年,我去朋友的创业公司,帮他组建团队,一九年至今年,我于一家物流公司担任架构方面的工作,在开发中,我常见那种写业务能力很强,但代码细节惨不忍睹的开发者,于是我想整理一些我见过的代码片断,并提供一原创 2020-10-08 21:56:17 · 461 阅读 · 0 评论 -
oms系统回顾
需求我在公司负责的第一个项目是订单模块(OMS),与传统的电商订单不同,此处的订单主要是承接第三方的订单,比如菜鸟或拼多多之类的第三方平台会将订单信息发给我方系统,我方会将订单转成运单进行处理。并实时将运单状态信息传递给第三方平台。方案订单并非公司的核心业务,因此我不打算污染公司的核心业务系统和数据库。我将订单模块的业务与数据独立出来,单独构建一个系统,通过http协议调用TMS服务接口(主要是下单及运单路径回传接口)。第三方平台,提供的接口的数据格式以及业务流程都不一样,如果我要设计一个稳定的系统原创 2020-09-30 17:44:11 · 481 阅读 · 0 评论