V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hxysnail
V2EX  ›  程序员

有大佬熟悉高并发技术吗?有空进来交流一下

  •  1
     
  •   hxysnail · 2022-11-18 13:51:53 +08:00 · 6350 次点击
    这是一个创建于 736 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬,事情是这样的:前几天有个初学者朋友问我关于高并发的技术,这个话题有点大,在微信上简单跟他介绍了一些,然后想着周末抽个时间详细写出来,我列了一个提纲,大概这样展开:

    应用程序本身:

    • 套接字编程技巧
    • 经典多进程、多线程并发
    • IO 多路复用:select => poll => epoll
    • 协程
    • 内核参数:fs.file-max 以及 ulimit fileno
    • 跟操作系统和处理器架构相关的,比如 SMP MUMA CPU 缓存等
    • etc

    负载均衡架构:

    • 为什么要负载均衡
    • nginx
    • haproxy
    • lvs
    • dns
    • 会话保存
    • 均衡手段和策略
    • etc

    数据库优化:

    • SQL 调优、索引调优
    • 读写分离
    • 查询缓存
    • 数据分片(分表分库)
    • etc

    关于高并发方面,我目前知道的套路基本就是以上列的这些。我自己工作后这类场景涉及不太多的,肯定有疏漏,有经验的大佬帮忙补充一下,帮我补全知识面

    另外,由于我遇到的业务场景都不怎么牛逼,感觉也写不出彩,各位大佬有什么典型的应用场景也请不吝分享一下

    我梳理完毕,把文章整理好后,也会回来分享

    不胜感激~

    第 1 条附言  ·  2022-11-27 22:19:14 +08:00
    我将帖子提到的各种技术点梳理了一遍,大家可以参考:
    https://fasionchan.com/posts/high-concurrency/
    45 条回复    2022-11-27 22:16:38 +08:00
    sadfQED2
        1
    sadfQED2  
       2022-11-18 13:58:51 +08:00 via Android
    都不是关键,关键应该是加钱🐶
    hxysnail
        2
    hxysnail  
    OP
       2022-11-18 14:00:30 +08:00
    @sadfQED2 他确实是想加钱,但面试时被问到这些没答好
    xiaotianhu
        3
    xiaotianhu  
       2022-11-18 14:12:10 +08:00
    查询高并发 跟 写入高并发,区别还是挺大的。
    一般高并发还得搭配高可用。
    除了编码技巧,更多的还有架构设计,什么扩缩容降级之类的。
    而且理论跟实践差距也蛮大,我司的一个写入高并发业务,从最开始 Mysql/Redis 到 MongoDB 到现在 C++自己写 Raft 也折腾了好多年才勉强高可用了...
    hxysnail
        4
    hxysnail  
    OP
       2022-11-18 14:18:48 +08:00
    @xiaotianhu 没错,这个话题确实有点大,涉及面也广。你提到的 [服务降级] 我记下了,多谢~
    xsank
        5
    xsank  
       2022-11-18 14:19:37 +08:00
    不如针对场景写项目、晒代码,否则极容易形成八股
    opengps
        6
    opengps  
       2022-11-18 14:27:18 +08:00 via Android
    再加一层硬件方面的弹性伸缩,单机应用性能再高也是有个明显瓶颈摆在那,能堆硬件完成更高负载反而是现实业务最需要的指标
    hxysnail
        7
    hxysnail  
    OP
       2022-11-18 14:27:32 +08:00
    @xsank 没错,所以想跟大家收集一些比较典型的场景
    hxysnail
        8
    hxysnail  
    OP
       2022-11-18 14:28:51 +08:00
    @opengps 嗯嗯,弹性扩缩容打算归到负载均衡部分讨论
    hxysnail
        9
    hxysnail  
    OP
       2022-11-18 14:33:57 +08:00
    @opengps 加一层硬件大佬是指类似 F5 这种吗?
    anonymousar
        10
    anonymousar  
       2022-11-18 14:36:51 +08:00
    天天 oncall 离不开的只有 监控 p999 长尾

    其次要说扩容 限流 熔断
    hxysnail
        11
    hxysnail  
    OP
       2022-11-18 14:40:45 +08:00
    @anonymousar 监控测量 限流 熔断 确实被我忽略了,已记笔记,多谢提醒
    dudubaba
        12
    dudubaba  
       2022-11-18 14:41:37 +08:00
    高并发 ❎ 加机器 ✔️
    hxysnail
        13
    hxysnail  
    OP
       2022-11-18 14:43:34 +08:00
    @dudubaba 嗯嗯,负载均衡部分就是讨论如何加机器实现水平扩容
    tojike
        15
    tojike  
       2022-11-18 16:27:53 +08:00
    核心概念:以空间换时间
    dqzcwxb
        16
    dqzcwxb  
       2022-11-18 16:30:22 +08:00
    能分清串行并行并发就已经很强了
    bthulu
        17
    bthulu  
       2022-11-18 16:30:45 +08:00
    你们的并发, 都是 IO 并发吗? 没有人来聊聊非 IO 纯 CPU 并发计算吗?
    hxysnail
        18
    hxysnail  
    OP
       2022-11-18 16:32:56 +08:00
    @bthulu 是指并行计算吗?
    hxysnail
        19
    hxysnail  
    OP
       2022-11-18 16:33:24 +08:00
    @hunterzhang86 这个挺全面的,多谢
    ZSeptember
        20
    ZSeptember  
       2022-11-18 16:33:29 +08:00
    话题太大了,具体实施要看业务场景。
    bthulu
        21
    bthulu  
       2022-11-18 16:35:59 +08:00
    @hxysnail 是啊, 一个计算量很大的任务, 如何用到多个处理器核心来减少任务耗时
    ZSeptember
        22
    ZSeptember  
       2022-11-18 16:36:43 +08:00   ❤️ 1
    你这些太细了,高并发基本几个套路

    缓存 + 异步 + 分区
    wdwwtzy
        23
    wdwwtzy  
       2022-11-18 17:04:37 +08:00
    真不是几句话能说清楚的
    yuanmouren1hao
        24
    yuanmouren1hao  
       2022-11-18 17:07:26 +08:00
    1 、理论上横向弹性伸缩可以无限加,
    2 、 采用合适的技术或优化可以节省核数
    newmlp
        25
    newmlp  
       2022-11-18 17:10:19 +08:00
    高并发不得用 dpdk 吗,epoll 不行
    NoString
        26
    NoString  
       2022-11-18 17:13:15 +08:00
    你可以关注美团技术团队,里面有不少实践的内容,包括但不限于:
    NoString
        27
    NoString  
       2022-11-18 17:14:46 +08:00
    1.日志系统
    2.高峰期下单和订单查询
    3.广告系统
    https://tech.meituan.com/

    这些系统对可用性要求都比较高,加上请求的流量都很庞大
    (刚才手抖发出去了)
    westoy
        28
    westoy  
       2022-11-18 17:15:34 +08:00
    没具体业务谈这个就跟太监谈上青楼一样

    有业务加钱自然有办法解决, 到现在有哪个流量平台是被流量增长搞死的,caoz 以前写过一些文章, 当年 BAT 里以技闻名的 B 都搞过很多土法炼钢的解决方案

    而且 c10k 、c100k 这种问题不是十年前流行的么, 现在还有人会问? 不都是八股么, 不要假想一些问题
    luomao
        29
    luomao  
       2022-11-18 17:19:23 +08:00
    期待一波大佬的分享
    blackeeper
        30
    blackeeper  
       2022-11-18 17:52:26 +08:00
    套路有很多,队列,CDN ,anycast ?
    想要高并发,从浏览器-----中间设备-------服务器------数据库,各个阶段缓存
    用队列削峰填谷,异步处理,提高并发
    根据 dns ,src-IP ,cookie ,id ,做水平切割,画逻辑区做负载
    hxysnail
        31
    hxysnail  
    OP
       2022-11-18 18:14:24 +08:00
    @westoy 不敢苟同。太监谈上青楼固然尴尬,但也有一句俗话:没吃过猪肉还没见过猪跑吗?有具体业务固然好,但这不是没机会接触嘛。

    土法炼钢我觉得要他要传达的思想是业务第一,技术第二,毕竟技术是服务业务的,不能盲目追求技术。但这个贴我不想讨论业务问题,就一个纯粹的技术讨论帖,讨论实现高可用都有哪些技术手段可以采用。退一步讲,如果有更好的技术方案,我不相信他们会土法炼钢。这也是这个帖子的初衷,学习更多更科学的技术方案。

    c10k 、c100k 我解释一下,算是一个技术发展史介绍吧,主要目的是让初学者知道技术是怎么一脉相承,一步步发展到今天的。
    hxysnail
        32
    hxysnail  
    OP
       2022-11-18 18:17:03 +08:00
    感谢各位大佬无私分享,好多大佬都提到了异步化和队列,我之前也干过。但最近几年都在打杂,竟给忘了,哈哈
    hzxxx
        33
    hzxxx  
       2022-11-18 18:27:44 +08:00
    其实没有具体业务场景经验,问高并发真的是很八股,基本只能听别人的经验和自己猜想的一些情况,心里不靠谱不踏实
    hxysnail
        34
    hxysnail  
    OP
       2022-11-18 21:24:20 +08:00
    @hzxxx 的确是个问题,但有一些了解总比没有好咯
    jeesk
        35
    jeesk  
       2022-11-18 23:01:40 +08:00
    呵呵 屁事多。 队列能解决 9 成问题。
    hxysnail
        36
    hxysnail  
    OP
       2022-11-18 23:05:32 +08:00
    @jeesk 其实吧,你说第二句就行了,第一句说了有什么意义呢?不过还是谢谢你
    jeesk
        37
    jeesk  
       2022-11-18 23:07:05 +08:00
    @hxysnail 就当图个槽, 主要是喷面试的。 还有就是你朋友既然是初学者, 我还是不建议你普及太多概念给他, 废脑子。
    jeesk
        38
    jeesk  
       2022-11-18 23:08:53 +08:00
    @bthulu 纯 cpu 优化算法呗, 减少 cpu 占用,还能怎么样?
    hxysnail
        39
    hxysnail  
    OP
       2022-11-18 23:10:52 +08:00
    @jeesk 我其实是想借此机会梳理个提纲性的材料,简单罗列一下都有些什么,用来做什么的。因为初学者想学也不知道要从哪入手,有个知识地图之类的指引应该会好一些
    blankmiss
        40
    blankmiss  
       2022-11-18 23:14:18 +08:00
    最好的方法就是堆机器
    westoy
        41
    westoy  
       2022-11-18 23:18:00 +08:00
    @hxysnail

    面向具体业务, 不是假设具体业务

    初学者不需要学这个, 因为根本没有任何意义

    架构和业务层的调整什么时候是一个需要面试才能入职的能影响的?

    这是面试干活儿的, 不是面试 VP 或者技术合伙人

    等初学者通过项目实践成长能干涉到架构的调整, 能去协调业务层配合的职级, 他就不是初学者了, 他也不需要再看这种
    hxysnail
        42
    hxysnail  
    OP
       2022-11-19 09:50:36 +08:00
    @westoy 架构有大有小,比如说你负责厂里一个很小的模块,它可能不需要 VP 或技术合伙人来做决策,但不意味着它不需要支撑高并发压力。我也不认为干活的人就不需要懂这些技术,难道干活的人只配 if else 堆业务逻辑吗?退一步讲,从干活能干涉到架构调整,也需要一些知识储备吧?一个人不可能天生就会这些东西呀。

    我不否认干活大部分情况下,是不需要用到这些东西的;我也不否认成长到能干涉架构调整时,这些东西早已掌握了,也不需要再看这种。但从前者到后者,起码有个学习过程吧?这个帖子就是想梳理一下,都有哪些技术点可以去了解、学习,仅此而已
    mind3x
        43
    mind3x  
       2022-11-19 17:09:41 +08:00 via Android
    看来国内真是人均手写 raft 的水平啊
    hxysnail
        44
    hxysnail  
    OP
       2022-11-19 22:20:50 +08:00
    @mind3x 怎么看出来的?感觉比人均水平差太多,raft 的原理是什么我现在都说不清楚,更别说写出来了……
    hxysnail
        45
    hxysnail  
    OP
       2022-11-27 22:16:38 +08:00
    花了一个周末把梳理出来的知识点都简单写了一遍,大家有兴趣可以看看:

    https://fasionchan.com/posts/high-concurrency/

    也算是完成了前些天立下的 flag
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 22:54 · PVG 06:54 · LAX 14:54 · JFK 17:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.