文档章节

也谈淘点点60s短信订单的架构设计

xue777hua
 xue777hua
发布于 2015/10/27 14:39
字数 882
阅读 7151
收藏 230

1. 前言##

看到了这个 http://www.oschina.net/question/926166_2137672
然后有人写了博客还分析设计了一下 http://my.oschina.net/u/926166/blog/522227

本人最近对架构设计较感兴趣,下面是我的设计,可以做到极大化性能和水平扩展,所有的性能issue都在网络IO。redis存储方面轻松支持同时上亿个订单。

2. 基于redis的详细设计##

  1. 使用一个高可用的时间序列发生器服务器。timeserver。
  2. 订单server产生了订单之后立即往redis的订单号服务器写一条记录,key为timeserver的nanosecond,存储类型为sorted set。把订单的详细信息写入另一个redis的详单服务器集群(用订单号hash写入)。
  3. 订单服务器有一个定时器线程,60s运行一次,时间到了发送一条消息(包含time server的当前nanosecond)给短信发送server。
  4. 短信发送server收到nanosecond的消息后,去redis订单号服务器取出所有小于该nanosecond的订单号,开启多个协程用订单号去redis详单服务器集群拿到详单数据,发送短信。
  5. redis配置成高可用。订单业务server和短信server都是无状态的,可以横向水平扩展。

3. 性能估计数据量估计##

nanosecond为19个字符,并且nanosecond作为订单号,假设为20字符,那么20byte*100,000,000,一亿个订单的话,redis的订单号服务器需要大约 1.8GB 的内存。而redis的详单服务器可以水平扩展,存储不是问题。

4. 架构点评

  1. 订单server和短信server都是无状态,可水平扩展。
  2. redis存储节点高可用,redis详单服务器集群可水平扩展。
  3. 协程处理拿订单数据和发送短信,简单高效。
  4. 尽量避免了各种可预见的性能问题,例如:什么定时器,每隔1s轮询一次等等,另外也有对redis进行多次请求订单号的,都对性能有一些影响。
  5. 有的人的设计甚至把队列设计到了订单server内,这严重影响了订单server的扩展性,如果一旦订单server挂了呢?呵呵。
  6. 有人想要采用MQ的方式来做,但是如何搞定延时就是个大问题,因为MQ的方式是,Producer发送了之后,Consumer会立即接收到,如果你在Producer这边缓存60s之后在发送,那万一在这段时间该Producer挂了呢?呵呵。这里补充下,有人提到RabbitMQ的延迟队列,的确也是一中更加简单的方案。先发送到队列1,队列1不处理,超过60s队列系统自动发送到队列2,队列2的消费者进行处理。也是简单。呵呵。

##5. 总结##

  1. 这是一个非常实用的需求。
  2. redis是一个好东西,因为redis的设计和接口足够简单,所以我们没有太多想象,所以我们的设计也足够简单。简单才可能健壮。

© 著作权归作者所有

xue777hua
粉丝 69
博文 45
码字总数 32450
作品 0
普陀
架构师
私信 提问
加载中

评论(52)

单行道
单行道
学习
xue777hua
xue777hua 博主

引用来自“王立强qy”的评论

楼主这么喜欢用“呵呵”,看到喃们的讨论确实学习到不少79
= = 『呵呵』没别的意思 表示微笑
w
wildq-qy
楼主这么喜欢用“呵呵”,看到喃们的讨论确实学习到不少79
xue777hua
xue777hua 博主

引用来自“雪里说”的评论

每个mq消息,都支持delay
嗯 只要是支持delay的queue 都是可以的
许雪里
许雪里
每个mq消息,都支持delay
许雪里
许雪里
为什么搞这么复杂,去看看我的分布式mq吧,可能对你有帮助:http://www.cnblogs.com/xuxueli/p/4918535.html
_森屿海巷_
_森屿海巷_
xue777hua
xue777hua 博主

引用来自“小树鹿鸣”的评论

我这边的做法,放在第三方存储系统,比如mongodb,做个3-5秒的轮询,这样偏差延迟在1-4秒内,而且对现在的业务也没影响,mongodb基于内存数据库,性能不是问题,MQ方案没用过。
是 mongodb 也是可以的,架构设计完全一样 MongDB的高可用方案也一样 shard方案原理也一样。
xue777hua
xue777hua 博主

引用来自“小树鹿鸣”的评论

60S触发一次扫描redis,这个任务延迟应该在1-59S,不能保证实时!
是的,这个时间都是可以配置和调整的。
小树鹿鸣
小树鹿鸣
我这边的做法,放在第三方存储系统,比如mongodb,做个3-5秒的轮询,这样偏差延迟在1-4秒内,而且对现在的业务也没影响,mongodb基于内存数据库,性能不是问题,MQ方案没用过。
关于淘点点面试中碰到的架构设计问题?

此题是面试淘点点的问题,由于没经验所以败在这个题目下面,因此请权威人士指点 指点,谢谢。。 问题描述:让您做一个电商平台,您如何设置一个在买家下订单后的”第60秒“发短信通知卖家发货...

Ambitor
2015/10/16
8.8K
21
关于淘点点面试中碰到的架构问题​

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

Ambitor
2015/10/26
9.6K
43
阿里的淘点点部门如何?

首先说下本人情况: 本人从事移动开发多年,先是从事kjava游戏应用开发,如今从事移动安卓开发,安卓开发经验大约4年,有一定的客户端\服务端架构设计能力。无管理经验。现在有内推机会去阿里...

mgic
2015/02/28
559
2
淘宝口碑外卖的API使用权限

淘宝口碑外卖(原淘点点)的开放平台使用权限. 目的是将外卖的订单数据整合到自己的ERP订单系统中. 有权限的朋友可以联系我.

Bright_Liu
2016/03/21
17
0
架构面试题—大并发量的订单的解析

问题描述:做一个电商平台,如何设置一个在买家下订单后的”第60秒“发短信通知卖家发货,需要考虑的是像淘宝一样的大并发量的订单。 原问题链接 https://www.oschina.net/question/926166_...

激情的狼王
2018/09/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis + Ehcache 二级缓存实例

二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕...

xiaolyuh
23分钟前
4
0
Spring源码学习(二)哎呦,按菜谱做菜与AbstractAutowireCapableBeanFactory.createBean流程差不多

记得跟老婆谈恋爱时,有一天心血来潮给老婆做饭,按照菜谱一步一步的做,结果差点把厨房烧了!!! 这事至今老婆还记得。 入口 上一篇说了,AbstractBeanFactory.getBean的主流程 ,今天来说下...

温安适
25分钟前
36
0
前端UI攻城狮 你们该抛弃jQuery了

你不再需要jQuery! Web工程师太依赖jQuery了,某种意义上说jQuery已经成了JavaScript的同义词。但是我们真的需要他么?或许我们应该反思一下什么时候才真的需要jQuery。 对我个人而言开始使...

前端老手
26分钟前
5
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
今天
6
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部