当前位置: 首页 > news >正文

关于淘点点面试中碰到的架构问题​

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

       从事开发工作两年来,从未写过只言片语,俗话说的好”好记性不如烂笔头“,最近心血来潮开始想慢慢写点博文,不仅是知识的积累还是为了若干年后回头看看当年努力的过程,希望把这个养成习惯并坚持下去,啰嗦了这么久 来点干货把。

      之前面试淘点点的时候被问倒得一个问题至今牵挂,由于工作环境的限制,我没能接触到一些大数据量的并发工作,也没能有机遇参与复杂系统的设计,而我学习复杂或高并发系统的唯一途径就是阅读源码,惭愧的是,至今也只阅读了Tomcat的部分源码,于是我在oschina上贴出问题与互联网猿一同分析(大家可以先看看问题:关于淘点点面试中碰到的架构问题),非常感谢大家的意见,尤其是@林中漫步 @JerryLin 两位先生 最终确定两钟实现思路:

1、具有排序功能的队列

2、Redis+定时器

思路 1

原理:第一种思路也就是大家推荐的延迟队列实现的原理,其就是一个按时间排好序的队列,每次put的时候排序,然后take的时候就计算时间是否过期,如果过期则返回队列第一个元素,否则当前线程阻塞X秒,这个也是JDK 自带 DelayQueue 的思路。详细可看源码

162808_Zfmx_926166.jpg

代码实现:待实现后补充

思路 2

原理:第二种思路需要利用Redis的有序集合,说到使用 Redis 就不得不考虑Score的设计,因为它直接决定你代码的复杂度,你思路的清晰性,在这我并没有采用 林中漫步 先生的设计,而是通过精确到秒的时间做Score(去掉毫秒),然后使用线程每一秒扫一次,使用当前时间作为zrangeBysocre命令的Score去查询。详细请看代码。

业务场景:按京东一天500万的成交量,一天主要成交时间为8小时,计算得出每秒173个订单,当然实际上订单不能均匀分布在每秒,但我们主要为了论证思想的可行性。

代码实现:这里首先我简单的利用Spring Scheduled作为订单的生产者,每一秒制造170个订单,放入Redis,注意Score的生成,为当前时间的后60秒,removeMillis()生成去掉毫秒的时间戳作为Rredis的Zadd方法的 Score(不了解的可以百度下)。

164259_f1hU_926166.jpg

第二步:同样利用Spring Scheduled 一秒钟心跳一次,每次利用当前时间作为Key 从Redis 取数据。

165511_lVFF_926166.jpg

经过测试,没有出现漏单的情况,这只是简单的实现,很多地方可以优化,在实际中用也可能会出现很多问题,需要不断完善,此案例只是提供思路,另外我觉得JDK的 DelayQueue 相对于Redis来说没有那么好,因为Queue毕竟每次取一个,如果同一时间的比较多可能不能符合当前这种时间严谨的需求,另外他是单机的,有时间我去研究下kafka、Rabbit的延迟队列再来补充。

终于写完了,因为公司的代码是加密的,所以不能上传源码了(其实也没得什么上的,哈哈),另外本人技术有限难免会有纰漏或者错误,欢迎拍砖,另外希望自己以后能够坚持写技术日志。


版权所有,转载请注明出处 http://my.oschina.net/u/926166/blog/522227


转载于:https://my.oschina.net/ij5IYLKW/blog/522227

相关文章:

  • AMP HTML助力移动Web提速
  • RCC BUCK-BOOST变压器设计
  • Android开发UI之给ImageView添加蒙版
  • 【转】你真的了解setTimeout和setInterval吗?
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • 4月数据库流行度排行榜 MySQL能否追上Oracle
  • 监控方案设计
  • 浅析:Android--Fragment的懒加载
  • iText生成pdf中文字体解决方案
  • c#xml操作
  • VC常用代码之创建进程
  • 第六章 对象作用域与servlet事件监听器
  • JavaScript HTML DOM 事件
  • 3D-HEVC的TAppDecorder
  • Hibenate second-level ehcache
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • __proto__ 和 prototype的关系
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES学习笔记(12)--Symbol
  • interface和setter,getter
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JWT究竟是什么呢?
  • Map集合、散列表、红黑树介绍
  • mysql常用命令汇总
  • October CMS - 快速入门 9 Images And Galleries
  • Python利用正则抓取网页内容保存到本地
  • 给新手的新浪微博 SDK 集成教程【一】
  • 关于springcloud Gateway中的限流
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 线性表及其算法(java实现)
  • 译有关态射的一切
  • 你对linux中grep命令知道多少?
  • ​第20课 在Android Native开发中加入新的C++类
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (12)目标检测_SSD基于pytorch搭建代码
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (14)Hive调优——合并小文件
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (C语言)字符分类函数
  • (js)循环条件满足时终止循环
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (七)Knockout 创建自定义绑定
  • (全注解开发)学习Spring-MVC的第三天
  • (十六)Flask之蓝图
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)3D模板阴影原理
  • (转载)OpenStack Hacker养成指南
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .a文件和.so文件