限流算法
常见的限流算法主要有两种:令牌桶和漏桶算法,也可以使用计数器进行粗暴限流实现。
算法原理
计数器
维护一个请求数量,在一段时间里,如果请求总数超过了limit,那么我们可以把这个请求拒绝掉,也可以将其放入到缓冲队列中,等待下一个时间段再进行操作。
常见的限流算法主要有两种:令牌桶和漏桶算法,也可以使用计数器进行粗暴限流实现。
维护一个请求数量,在一段时间里,如果请求总数超过了limit,那么我们可以把这个请求拒绝掉,也可以将其放入到缓冲队列中,等待下一个时间段再进行操作。
在实际生产过程中,我们往往会通过集群的方式部署服务器,而不是单机部署,从而可以提高服务的并发能力。
但是这样部署产生了一个新的问题:如何决定某个请求发往的服务器?这就是负载均衡算法所需要解决的问题。
在介绍一致性哈希之前,首先来看看集群部署可能发生的问题:比如说我现在有5台 Redis
服务器,正常运行了很久,很不巧有一天A服务器崩溃了,这个时候还有4台服务器,系统还可以正常运行,原来发送到A服务器的请求我们肯定要想办法进行重定向吧,如果说我们使用一般的哈希函数进行分配,无疑是 hash(key) % num
,不过因为 num
现在变成了 num-1
,那么很有可能所有的请求都会发生改变打到不同的服务器上,原来发送到B的请求重新处理之后可能发送到了C服务器了。
使用 Go 搭建 Web 后端,最简单的就是使用原生的 net/http
库了,下面是一个简单的例子:
1 | package main |
运行代码之后,便会在8080端口处监听,接收客户端的请求,然后返回响应,访问 http://localhost:8080
即可以访问到对应的内容。
Golang不支持在函数定义的时候声明默认值,也就是说我们不能够使用类似下面的代码
1 | func New(addr string="localhost", port string="8080"){ |
并且也不支持函数的重载,函数名不能够重复,无法根据需要的参数数量创建不同的函数形式,也就是我们不能使用下面的方式
1 | func New(addr string){ |