Websocket

websocket基于tcp全双工通信协议

  1. RFC 6455 source insight

open handshake 用来兼容http协议

http协议包较大

Netty-socket是socket.io的java实现

Connection: Upgrade

Upgrade: websocket

client—>server—>client

Sec-WebSocket-Key: 双方约定好计算关系(SHA-1 Base64-encode) 返回给客户端

Socket.IO 实现了实时双向的基于事件的通讯机制。旨在让各种浏览器与移动设备上实现实时app功能,模糊化各种传输机制。

Socket.IO 是跨平台,多种连接方式自动切换,做即时通讯方面的开发很方便,而且能和expressjs提供的传统请求方式很好的结合,即可以 在同一个域名,同一个端口提供两种连接方式:request/response, websocket(flashsocket,ajax…).

高并发

  1. 高连接
  2. 数据解析
  3. 数据广播

Redisson

redissonLock.lock()加锁 实现锁续命功能

redissonLock.unlock()

高并发分布式锁实现

分段锁 库存分段存储

不同段位的库存放置到不同cluster

秒杀

页面静态化

cdn加速

秒杀按钮点亮

回源

nas盘服务 js定时刷新后更改function

缓存

localCache一级缓存

Redis二级缓存

缓存一致性

最终一致性

多级缓存一致性

Redis channel订阅后将 无ack机制 无重发 不保证能发送到所有节点

cache过期时间

布隆过滤器

计算位置 二进制 向量 可存储到redis中getBit

防超卖

预下单:放redis中进行预减库存

异步下单

幂等性标识字段一定要全局唯一(分库分表 分布式)

订单号生成规则 分布式Id

8位日期+2位平台来源+2位支付方式+6位(redis:incr)生成

系统时间+用户id一部分+全局序列

雪花算法:对时间依赖严重

美团Leaf 全局ID唯一

百度:UUID生成器

RocketMq事务消息,2pc,SAGA,TCC

适合场景:没有资源竞争的场景,实时性相对滞后 下单之后删除购物车 加积分

限流防刷

秒杀地址隐藏:

  1. 隐藏
  2. 动态变化

增加验证码

/{token}/常规地址

redis设置并行量总和 令牌桶防刷

数据一致性维护

Canal 把自己伪装成mysql从服务器

存在数据覆盖问题 数据一定要带个版本号

databus