本文摘选的是极客时间和慕课网中学生给我的留言。
极客时间 - 秒杀限流
提问出处 https://time.geekbang.org/dailylesson/detail/100044013
1.老师您好,如果是使用通用网关来进行限流的话,如何细化到对每个接口进行限制?谢谢
答:您好,对api接口限流的话,可以使用google guava封装的令牌桶算法就可以实现。或者使用漏桶算法、计数法等都可以实现。
如果必须在通用网关层面实现,可以使用OpenResty。
追问:
您好,比如在通用网关层限流的话流量阈值该怎么决定呢,是单个接口的阈值还是所有接口的阈值之和?还有一个就是一般是不是通用网关层和api接口都建议限流?谢谢!
答:
(1).流量阈值该怎么决定?
建议结合压力测试的结果,进行调整。
(2)单个接口的阈值还是所有接口的阈值之和?
需要参考实际的部署情况。总原则是,抵达各个服务器的流量,要限制在每个服务器的可承受范围内。
不论是单接口还是所有接口,只要保证接口后的服务器 能够承受住 就行。
举个例子,如果单接口跳转的服务器是A,多个接口共同跳转的服务器是B。那么就对单接口、或多个接口限流,限到最后保证服务器A和B各自能够承受住流量的冲击即可。
(3)通用网关层和api接口都需要限流吗?
建议结合实际的流量大小和压测结果。
如果网关限流后,流量已经可控,就不用再限了。如果经过网关后,流量仍然大,就再次限流,也就是层层限流。但要注意,本节课也讲了,多一层限流 虽然可以进一步控制流量(利),但也同时会增加流量的跳转路径(弊)。
2.老师,合法性限流具体的手法和部署可以详细讲解一下吗,是在网关这个层面来处理吗,如果是的话那后面负载限流中NGINX也是一种网关的功能吗?
答:可以在nginx中设置IP黑名单。另外,nginx本身是既可以做网关,又可以做负载均衡。
极客时间 - 跨语言RPC
提问出处:https://time.geekbang.org/dailylesson/detail/100044012
1.普通的java客户端调用java服务端 网络传输数据不也是转化成二进制吗 没搞懂用protobuf 为什么转换成二进制就可以进行跨语言传输了 希望能解答一下
答:简单的说,就是pb支持各种语言通用的序列化和反序列化方式;而如果使用java序列化为二进制,则无法被java以外的其他语言反序列化。
2.我们目前已经大量使用Java的ObjectStream来作为相同语言之间的传输字节数组的格式。为了兼容其他语言的调用客户端,同时也不影响目前已有的序列化和反序列化机制,是否可以直接从Java pojo源码直接生成.proto文件呢?
答:您好。
(1).pojo转.proto文件,需要自己写一个转换工具类了。
(2).以您目前的情况,可能在一个项目中,要同时存在两套数据传输机制了:基于ObjectStream的RMI,和基于protobuf(或thrift等)的RPC。
慕课网 - 软引用&超卖
提问出处:https://www.imooc.com/read/56/article/1207#comments
1.老师您好,请教一个问题,如果用以下的写法是否就同时存在两个引用了 弱引用和强引用 Object obj = new Object(); SoftReference softReference = new SoftReference<>(obj);
答:2个,强引用和软引用。但如果后面再加一句obj=null,就只有一个引用了(软引用)
提问出处:https://www.imooc.com/read/56/article/1213#comments
2.除了使用zookeeper解决以外,还有什么办法可以解决超卖问题?
答:可以从流程上避免超卖:超卖发生的时机是“用户在支付的时候,进行减库存操作”。如果把流程改为“在用户下单的时候,进行减库存操作”,就可以把减库存的逻辑控制在“下单后、支付前”这段时间里,因此就可以避免超卖的现象了。
- 完 -
推荐阅读