架构

1、接口幂等性的实现方式

2、如何避免下重复订单

1、当进入商品详情页时,去生成一个全局唯一ID(可用雪花算法);
2、将这个全局唯一ID和订单信息传给服务器;
3、判断这个ID对应的订单号存在,则直接返回;
4、生成订单号,保存订单信息;
更多请查看 如何避免下重复订单

3、如何实现下订单后一个小时后未付款的订单自动取消

为了避免轮询并且在服务端主动取消订单,可以使用类似于消息队列的方式,比如 redis 的 pub/sub 服务。

1、DelayQueue 延时队列,此队列放入的数据需要实现java.util.concurrent.Delayed接口,用户存放待取消订单
2、redis 分布式缓存,用于存放待取消订单,数据可以长久存放,不受服务启停影响
3、监听器,监听某一事件,执行一定的逻辑

4、三高:高并发、高性能、高可用

一. 高并发

高并发是现在互联网分布式框架设计必须要考虑的因素之一,它是可以保证系统能被同时并行处理很多请求,对于高并发来说,它的指标有:

  • 响应时间:系统对进来的请求反应的时间,比如你打开一个页面需要1秒,那么这1秒就是响应时间。
  • 吞吐量:吞吐量是指每秒能处理多少请求数量,好比你吃饭,每秒能吃下多少颗米饭。
  • 秒查询率:秒查询率是指每秒响应请求数,和吞吐量差不多。
  • 并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

二. 高性能

什么是高性能呢?高性能是指程序处理速度非常快,所占内存少,cpu占用率低。高性能的指标经常和高并发的指标紧密相关,想要提高性能,那么就要提高系统发并发能力,两者互相捆绑在一起。应用性能优化的时候,对于计算密集型和IO密集型还是有很大差别,需要分开来考虑。还有可以增加服务器的数量,内存,IO等参数提升系统的并发能力和性能,但不要浪费资源,要考虑硬件的使用率最高才能发挥到极致。

怎么样提高性能呢?

  1. 避免因为IO阻塞让CPU闲置,导致CPU的浪费
  2. 避免多线程间增加锁来保证同步,导致并行系统串行化
  3. 避免创建、销毁、维护太多进程、线程,导致操作系统浪费资源在调度上

三. 高可用

高可用通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。高可用注意如果使用单机,一旦挂机将导致服务不可用,可以使用集群来代替单机,一台服务器挂了,还有其他后备服务器能够顶上。或者使用分布式部署项。比如现在redis的高可用的集群方案有: Redis单副本,Redis多副本(主从),Redis Sentinel(哨兵),Redis Cluster,Redis自研。

5、如何进行系统拆分?

可以从纵向和横向来拆分:

  • 纵向拆分:从业务维度进行拆分。标准是按照业务的关联程度来决定,关联比较密切的业务适合拆分为一个微服务,而功能相对比较独立的业务适合单独拆分为一个微服务。
  • 横向拆分:从公共且独立功能维度拆分。标准是按照是否有公共的被多个其他服务调用,且依赖的资源独立不与其他业务耦合。

1、单一职责、高内聚低耦合;
2、服务粒度适中;
3、考虑团队结构:(康威定律:设计系统的组织其产生系统的设计和架构等价于组织间的沟通结构。就是指每个团队开发设计和测试发布自己团队的微服务时,要互不干扰系统效率才能得到提升,)
4、 以业务模型切入:(领域模型:对具体某个边界领域的抽象,反应了领域内用户业务需求的本质。领域模型只反应业务与任何技术是现实没有关系的,不仅反应领域间的实体概念还能反应领域间的过程概念)
5、演进式的拆分;
6、避免环形依赖与双向依赖:(如:商品服务于订单服务相互依赖)

6、令牌桶和漏桶使用场景?

记住一条,令牌桶会比漏桶更优就行了,99%选用令牌桶。如果请求产生的速率恒定,令牌桶和漏桶效果一样。如果请求分布不均匀,令牌桶比漏桶好。

7、如何设计一个接口?

接口设计需要考虑哪些方面

1.接口的命名。
2.请求参数。
3.支持的协议。
4.TPS、并发数、响应时长。
5.数据存储。DB选型、缓存选型。
6.是否需要依赖于第三方。
7.接口是否拆分。
8.接口是否需要幂等。
9.防刷。
10.接口限流、降级。
11.负载均衡器支持。
12.如何部署。
13.是否需要服务治理。
14.是否存在单点。
15.接口是否资源包、预加载还是内置。
16.是否需要本地缓存。
17.是否需要分布式缓存、缓存穿透怎么办。
18.是否需要白名单。

接口设计原则
原则一:必须符合Restful,统一返回格式,约定业务层错误编码,每个编码可以携带可选的错误信息。
原则二: 命名必须规范、优雅。
原则三:单一性。
单一性是指接口要做的事情应该是一个比较单一的事情,比如登陆接口,登陆完成应该只是返回登陆成功以后一些用户信息即可,但很多人为了减少接口交互,返回一大堆额外的数据。
原则四:可扩展。
原则五:必须有文档。
原则六:产品心。
原则七:第三方服务接口数据能缓存就缓存。
原则八:第三方服务需要做降级。
原则九:建议消除单点。
原则十:接口粒度要小。
原则十一:客户端能处理的逻辑就不要给服务端处理,减少服务端压力。
原则十二:资源预加载。
原则十三:不要过度设计。
原则十四:缓存尽量不要穿透。
原则十五:接口能缓存就缓存。
原则十六:思辨大于执行

8、日志框架

image.png

9、一次完整的HTTP请求过程

域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户。

10、网站统计IP PV UV实现原理

  • PV(访问量):Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。
  • UV(独立访客):Unique Visitor,一般使用cookie标记,访问您网站的一台电脑客户端(比如一台电脑开多个浏览器访问则为多个UV)为一个访客,00:00-24:00内相同的客户端只会被计算一次。
  • IP(独立IP):指独立IP数。00:00-24:00内相同IP地址之被计算一次(多台电脑可能共用一个ip)。

ip、pv、uv的区别:

  • IP(独立IP):某IP地址的计算机访问网站的次数。这种统计方式很容易实现,具有真实性。所以是衡量网站流量的重要指标。
  • PV(访问量):PV反映的是浏览某网站的页面数,所以每刷新一次也算一次。就是说PV与来访者的数量成正比,但PV并不是页面的来访者数量,而是网站被访问的页面数量。
  • UV(独立访客):可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的。

工作流程:

  • 1、编写监控javascript和提供接口。这个接口返回的是监控网站对应的javascript文件,这个文件可以再客户端可以标记和采集访客的信息。
  • 2、网站调用接口。只需将引入javascript到要监控的站点即可,访客访问该站点时,javascript文件就会被加载。
  • 3、标记和采集数据。监控js被加载后就会往浏览器写入cookie标记访客,比如新访客生产一个新cookie和标记访问次数,若是老用户则,读取 cookie信息,计算访问次数和最后访问时间等,这些客户端的信息处理完后,则向指定的服务器发送数据。
  • 4、最后服务器接收javascript提交过来的数据处理入库和后续的数据处理了。

11、如何去设计分布式监控中心?

监控中心最基本四个功能:

  1. 数据采集
  2. 实时绘图
  3. 告警
  4. 数据存储

大概原理:

  • 监控中心的agent需要安装到被监控的主机上,它负责定期收集各项数据,并发送到监控中心server,监控中心server将数据存储到数据库,监控中心web在前端进行绘图。

agent收集数据分为主动和被动两种模式:

  • 主动:agent请求server获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy
  • server向agent请求获取监控项的数据,agent返回数据。

一般需要监控哪些数据:

  • 可以自己埋点获取监控信息
  • 代码运行时间统计、次数、错误次数
  • 服务器系统信息、JVM 内存/GC信息、线程信息
  • SQL语句执行时长
  • 各个进程的CPU和内存使用情况

现在市面比较流行的监控组件:
按照功能划分:

image.png

  • 日志:肯定是ELKB
  • 调用链APM:OpenTracing、Cat、Pinpoint、zipkin

12、分布式集群怎么生成唯一id

  1. 数据库自增长序列或字段
  2. UUID
  3. UUID的变种
  4. Redis生成ID:主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现
  5. Twitter的snowflake算法:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。
  6. 利用zookeeper生成唯一ID:zookeeper主要通过其znode数据版本来生成序列号,可以生成32位和64位的数据版本号,客户端可以使用这个版本号来作为唯一的序列号。
  7. MongoDB的ObjectId:MongoDB的ObjectId和snowflake算法类似。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它。MongoDB 从一开始就设计用来作为分布式数据库,处理多个节点是一个核心要求。使其在分片环境中要容易生成得多。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容