获得徽章 9
#青训营笔记创作活动#
1月18日 打卡day5
今日学习
Kafka 是一种分布式的,基于发布 / 订阅的消息系统。
以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能。
展开
评论
#青训营笔记创作活动#
1月17日 打卡day4
今日学习
TCP协议本身是全双工的,但我们最常用的HTTP1.1,虽然是基于TCP的协议,但它是半双工的,对于大部分需要服务器主动推送数据到客户端的场景,都不太友好,因此我们需要使用支持全双工的websocket协议。
在HTTP1.1里。只要客户端不问,服务端就不答。基于这样的特点,对于登录页面这样的简单场景,可以使用定时轮询或者长轮询的方式实现服务器推送(comet)的效果。
对于客户端和服务端之间需要频繁交互的复杂场景,比如网页游戏,都可以考虑使用websocket协议。
websocket和socket几乎没有任何关系,只是叫法相似。
正因为各个浏览器都支持HTTP协议,所以websocket会先利用HTTP协议加上一些特殊的header头进行握手升级操作,升级成功后就跟HTTP没有任何关系了,之后就用websocket的数据格式进行收发数据。
展开
评论
#青训营笔记创作活动#
1月15日 打卡day3
今日学习
电脑插上网线,联网后会通过DHCP协议动态申请一个IP,同时获得子网掩码,路由器地址等信息。
DHCP分为四个阶段,分别是 Discover,Offer, Request和ACK。如果曾经连过这个网,机器会记录你上次使用的IP,再次连接时优先使用原来的那个IP,因此只需要经历第三第四阶段。
DHCP是应用层协议,考虑到需要支持广播功能,底层使用的是UDP协议,而不是TCP协议。
DHCP分配下来的IP是有可能跟某台手动配置的IP地址重复的。
DHCP得到IP之后还会发3次无偿ARP通告,在确认没有冲突后开始使用这个IP。
展开
评论
#青训营笔记创作活动#
1月14日 打卡day2
今日学习
作者客户端开发转到服务端开发的一些经验:客户端开发的编程思维是“页面驱动设计”,而服务端开发的编程思维是“数据驱动设计”,即“通过不断的数据积累和反馈,来指导产品的更新迭代”。
DDD (Domain Driven Design):领域驱动设计。
DDD最大的价值就是梳理业务需求,抽象出一个个“领域”,并形成各个领域之间的接口交互,方便团队协作,推进项目前进。
展开
评论
#青训营笔记创作活动#
1月13日 打卡day1
今日学习
常见限流方式之一:计数器

原理好理解,这里补充两种计数器的实现方式:互斥锁和原子操作

原子操作由**底层硬件**支持,而锁则由操作系统的**调度器**实现。锁应当用来保护一段逻辑,对于一个变量更新的保护,原子操作通常会更有效率,并且更能利用计算机多核的优势,如果要更新的是一个复合对象,则应当使用`atomic.Value`封装好的实现。

常见限流方式之二:滑动窗口

滑动窗口是将计数器的时间区间进一步划分多个格子,以格子为单位右移

计数器是只有一个格子的滑动窗口,格子越多,精度越高,但更新频率越快,计算负担越大,同时无法根本上解决临界点的问题

常见限流方式之三:漏桶

相当于给业务加了个缓冲区队列,同步执行时等待线程会阻塞;异步执行时业务由水桶代理执行,调用方只能知道请求被接受了,不知道请求具体什么时候执行

常见限流方式之四:令牌桶(Token Bucket)

按照一定生成速率在桶中生成令牌,请求到来时从桶里拿令牌,桶为空则阻塞或拒绝请求

令牌桶相对于漏桶的不同:

- 漏桶限制的是最大流出速率
- 令牌桶限制的是平均流入速率,并允许一定程度突发流量

Golang中还有一种限流方式:借助channel进行限流,有点像令牌桶

Golang官方也有自己的基于令牌桶的限流器,见`time/rate`包的`Limiter`类型
展开
评论
关注了
优弧
VIP.5 如鱼得水
下一页
个人成就
文章被点赞 17
文章被阅读 1,160
掘力值 184
收藏集
1
关注标签
3
加入于