高并发每日学习【2020-09-28】

问题:高并发带来的问题有哪些?
答案:写入脏数据,服务器雪崩从而引发的单点故障,恶意的DDOS导致的带宽占用变高等

问题:实现负载均衡的常见算法有哪些?
答案:nginx负载均衡算法
(1)round-robin:轮询,默认负载均衡算法,通过配合weight配置可以实现加权轮询;
(2)ip_hash:根据客户IP进行负载均衡,相同IP将负载均衡到同一个上游服务器;
(3)hash key [consistent]:对某一key进行哈希或使用一致性哈希算法进行负载均衡;
(4)least_conn:最少连接,将请求负载均衡到最少活跃连接的上游服务器。配置服务少时会转用加权轮询算法。

问题:同样高并发下,微信/微博/12306 实现难度一样吗?为什么?
答案:不一样。原因:从三场景的核心业务分析:
QQ:个人、好友、所在的群,群、群成员、群消息、个人消息 等,这些信息的读写均有一个特点:都会带上ucid、群id(group_id),消息id(msg_id),在用户量,并发量很大时,消息读写并没有冲突
微博:微博核心业务是feed流: 即发消息(写)和刷消息(读),并且是典型的读多写少,在用户刷消息时,自己feed流里的消息,是由别人发出的。简单实现为:取好友list->每个好友的最近消息->消息集合排序展示首屏 微博会有一定数据的读写冲突
12306:核心业务:查票和买票 用户量并发量很大时有极大的锁冲突

QQ还有一点,使用UDP协议来发消息,并不保证消息一定送达

问题:linux服务器正常情况下仅能同时支持1024个TCP连接,如何配置服务器让服务器支持更高数量的TCP并发连接,实现高并发?
答案:在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。

问题:应对高并发的几种常见思路?
答案:
1.服务器做负载均衡集群,减少单一服务器的资源负担
2.分库分表,分库减少单一数据库的负担,分表防止因数据量增多而降低数据库的性能
3.数据库读写分离,减轻数据库负担
4.将数据存到redis缓存,减少读库操作
5.事务+锁,防止高并发引起的数据错乱

这个话题比较大,我看就是罗列了一些常见的方法,其实可以考虑再抽象一些, 比如:纵向拆分,scaleup,scaleout,缓存,多进程/多线程/协程等等

问题:设计高并发系统有哪些需要关注的目标?
答案:高并发绝不意味着只追求高性能,从宏观角度看,高并发系统设计的目标有三个:高性能、高可用,以及高可扩展。
1、高性能:性能体现了系统的并行处理能力,在有限的硬件投入下,提高性能意味着节省成本。同时,性能也反映了用户体验,响应时间分别是100毫秒和1秒,给用户的感受是完全不同的。
2、高可用:表示系统可以正常服务的时间。一个全年不停机、无故障;另一个隔三差五出线上事故、宕机,用户肯定选择前者。另外,如果系统只能做到90%可用,也会大大拖累业务。
3、高扩展:表示系统的扩展能力,流量高峰时能否在短时间内完成扩容,更平稳地承接峰值流量,比如双11活动、明星离婚等热点事件。
这3个目标是需要通盘考虑的,因为它们互相关联、甚至也会相互影响。
比如说:考虑系统的扩展能力,你会将服务设计成无状态的,这种集群设计保证了高扩展性,其实也间接提升了系统的性能和可用性。
再比如说:为了保证可用性,通常会对服务接口进行超时设置,以防大量线程阻塞在慢请求上造成系统雪崩,那超时时间设置成多少合理呢?一般,我们会参考依赖服务的性能表现进行设置。

问题:为什么需要连接池?
答案:工程架构中,与很多需要访问下游的需求,下游包括但不限于服务\数据库\缓存,当并发量很低的时候,连接可以临时建立,但当服务吞吐达到几百,几千时,建立连接销毁连接就会成为瓶颈。所以,当服务启动时一般先建立若干链接,请求到达时先从链接组中取出一个在执行下游操作,执行完释放

问题:高并发下的关注点有哪些?
答案:
1.高效的dns解析。
2.网络传输的效率,内网访问。
3.后端服务的承载能力,服务器扩容。
4.缓存的使用,尤其是查询类微服务数据。
5.数据库主从分离,多中心区域类IDC建设。
6.压测,得到目前的承载能力。
7.核心业务性能分析,代码优化,少写一行是一行。

问题:高并发处理中常见的限流算法有哪些?
答案:
1.计数器限流
方式:设置全局总请求数或者一定时间段的总请求数的阈值,超过阈值则不再处理该请求
优点:实现方式最简单
缺点:出现“突刺现象”,即单位时间段的前几秒请求超过了阈值,该时间段内剩余的时间全部都拒绝服务。
2.漏桶限流
方式:将所有请求放入桶中,以一定的速率处理桶中的请求,不管请求的速度怎么样,处理请求的速度是固定的。
优点:可以消除突刺现象,将瞬间的高峰请求分散开进行处理
缺点:处理请求的速度是固定的,对于突发调用不能瞬时响应
3.令牌桶限流
方式:设置一个桶,用来存放固定数量的令牌。设计算法以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。
优点:相比漏桶算法,速度是可变的,只要桶中有令牌,就可以瞬间处理大量的突发请求,响应速度要比漏桶算法快
缺点:同漏桶算法一样,对于超过桶容量的请求没有办法,只能丢弃。

问题:提高并发能力的方式在方法论上一般分为垂直扩展和水平扩展,那什么是垂直扩展?什么是水平扩展?数据层(DB和缓存)的主从同步读写分离属于水平扩展吗?为什么?
答案:垂直扩展一句话解释就是提升单机性能,它的不足也显而易见 单机性能总有局限性
水平扩展一句话解释就是通过增加服务器数量来提高性能(PS:互联网分层架构中每一层又是如何水平扩展的?)
数据层的主从同步读写分离不属于水平扩展,因为水平扩展是将一台机器上的数据水平拆分到不同的机器上,每台机器数量是全集的1/n且每个机器上的数据均没有交集,而且读写性能理论上均可以提升N倍。但主从同步读写分离扩展时每个机器上的数据一样均是全集,读性能可以提升N倍但写性能不变仍是单点写入

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值