javaweb 高并发,和多线程。为什么没有一本书上都没有写怎么用啊。 比如线程池这些。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Midnight17
V2EX    Java

javaweb 高并发,和多线程。为什么没有一本书上都没有写怎么用啊。 比如线程池这些。

  •  
  •   Midnight17 2019-07-03 22:04:05 +08:00 7862 次点击
    这是一个创建于 2292 天前的主题,其中的信息可能已经有所发展或是发生改变。
    遇到 java 的面试,怎么用线程池,我连个例子都找不到。虽然有很多高并发设计的书。 我怎么才能在百万级流量入门。
    28 条回复    2019-07-07 21:14:47 +08:00
    UFc8704I4Bv63gy2
        1
    UFc8704I4Bv63gy2  
       2019-07-03 22:45:57 +08:00 via Android   3
    因为写书的人根本就不懂
    opengps
        2
    opengps  
       2019-07-03 22:55:36 +08:00
    不同时代的处理方式不同。你看看负载均衡,云计算相关就找到解答方式了。
    多线程能用最好,用来提升单机承载力
    架构才是直线提升负载能力的(真实业务下:压力打了加机器就能解决相对容易的多)
    murmur
        3
    murmur  
       2019-07-03 23:01:38 +08:00   1
    java 要处理的问题很多,如果是现在的场景,基本上 java 语言不是问题,负载都压在数据库上,那问题就落在读写分离、缓存、集群这些
    如果单纯是很小的运算,比如就一个内存计数器,这种就没必要上 java 了
    murmur
        4
    murmur  
       2019-07-03 23:09:03 +08:00   1
    这里我有必要借机黑一下 B 站的游戏,这是一个需求理解和技术开发都是不及格的例子

    fgo 有一个魔神柱活动(这个活动的重要性就不说了),简单点说就是你可以高效的刷材料,但是大家需求的材料就在几根柱子上,每种柱子的数量都是有限的,那么如果你是负责人,你要怎么写相关的代码

    1、首先分析需求,fgo 是个近乎于单机的游戏,没有 pvp,所以你打多少材料不影响赚钱,也就是这柱子最终刷出去 500w 还是 600w 根完全不重要,也就是说这个连线程锁都不需要考虑
    2、柱子总共不超过 10 种,活动持续时间可能 2 天就结束了,那么内存计数器就可以完成需求,甚至我可以要非线程安全的计数器来提升性能
    3、游戏开服的时间在 6 点左右,这个时候很多人没有下班,可能等他们下班,或者一觉睡醒,活动结束了,肝帝的胜利

    所以这个所谓的高并发怎么做?答案是根本就不做计数器,每次弄个随机数让他慢慢减,减到第三天所有柱子都自然消失就可以,这样即没有任何性能问题,又不会让上班族失望

    结果呢,这么简单的需求,第一次直接服务器崩了,崩到第二天破晓才修好。。
    txy3000
        5
    txy3000  
       2019-07-03 23:11:28 +08:00 via Android
    没有具体的业务场景 谈高并发就是让你吹 唬住面试官就行了
    Takamine
        6
    Takamine  
       2019-07-03 23:15:10 +08:00
    吹就好了,如何设计基础架构中间件保证 HA 的,你用了熔断降级 balabala 保证了什么什么。:doge:
    txy3000
        7
    txy3000  
       2019-07-03 23:19:35 +08:00 via Android
    所以说还不如考算法 白板编程硬核
    razertory
        8
    razertory  
       2019-07-03 23:22:48 +08:00
    说出来你可能不信。Web 端的高并发并不一定要用多线程
    misaka19000
        9
    misaka19000  
       2019-07-03 23:23:40 +08:00   1
    tcpdump
        10
    tcpdump  
       2019-07-03 23:58:02 +08:00   2
    巷子里的技师,个个都处理过上亿的流量
    Midnight17
        11
    Midnight17  
    OP
       2019-07-04 02:38:30 +08:00
    想看看一个高并发的项目例子。 最后用到线程池。android 我倒是必须用多线程(网络请求),控件更新,但是 javaweb 的项目很难找到这些东西。
    luckylo
        12
    luckylo  
       2019-07-04 04:07:20 +08:00 via Android
    在处理任务的时候,比较常见。或者比较繁杂的统计类需求
    jerryshao
        13
    jerryshao  
       2019-07-04 05:54:55 +08:00
    我的建议是开几台机器,把你的服务部署上去,然后做 load testing。
    看看你单机和集群能处理多少请求,然后如何提高。
    在这个提高请求处理能力的过程中,你就会慢慢学到。
    xuanbg
        14
    xuanbg  
       2019-07-04 07:07:27 +08:00
    因为靠多线程是搞不定高并发的呀。多线程无非是最大程度压榨 CPU 而已,而一般业务系统的高并发瓶颈基本上是在 IO 上面,特别是数据库的 IO 上面。解决 IO 问题最有效的方法就是分布式服务,把压力分散到多个设备上面就好了。
    janxin
        15
    janxin  
       2019-07-04 07:58:52 +08:00
    你看的书似乎不对吧...我记得看到过啊...

    至于百万流量入门,业务压测之类的能解决你的疑问
    huyangq
        16
    huyangq  
       2019-07-04 08:46:22 +08:00 via iPhone
    框架里头用了
    itechify
        17
    itechify  
    PRO
       2019-07-04 08:57:32 +08:00 via Android
    会用了解 Doug Lee 写的 API 和原理就差不多了吧
    passerbytiny
        18
    passerbytiny  
       2019-07-04 09:10:05 +08:00
    以我看过的几本书(实现领域驱动设计、硝烟中的 Scrum 和 XP、数据仓库工具箱)的经验来说,书,哪怕是教程性质的书,其目的是全面总结经验或带你入门一种技术,所以只会举例而不会放实际的例子(实例会限制你的思想),或者说,只会告诉你应该怎么用,而不会告诉你怎么用。
    araraloren
        19
    araraloren  
       2019-07-04 09:30:56 +08:00
    @murmur B 站的游戏 是真的垃圾,前些日子还在玩碧蓝航线,更新了大版本之后崩溃劝退了。。
    各种崩溃
    neoblackcap
        20
    neoblackcap  
       2019-07-04 09:35:29 +08:00 via iPhone
    百万并发,我用两百万台机器解决一百万的并发算不算解决?还是说一台 1 核 1G 的虚拟机就可以?
    只是想吹嘘那不用学习什么书,观看各种大会那些上台嘉宾的 PPT 就可以了。里面已经有各种考点了。
    要实打实地用合理数量的机器解决 1M 问题,老实地从底层学起,搞懂计算机体系结构,搞懂 JVM,找到系统瓶颈,榨干机器性能
    wysnylc
        21
    wysnylc  
       2019-07-04 10:34:48 +08:00
    因为单机线程池没鸟用,解决并发的最终方案只有队列
    solwyer
        22
    solwyer  
       2019-07-04 10:37:43 +08:00
    本人做了一个 java 学习分享网站,大佬帮我看看:java 自学之路系列: http://how2j.cn/p/2199
    micean
        23
    micean  
       2019-07-04 11:09:21 +08:00
    去有百万流量的公司上班
    nonprocoder
        24
    nonprocoder  
       2019-07-04 11:22:56 +08:00
    大部分写书的都是水货,东拼西凑,去外网翻译文档,知道个毛
    Chabuduo001
        25
    Chabuduo001  
       2019-07-04 15:13:19 +08:00
    如果想找线程池的例子,可以看 Tomcat 源码中自定义的线程池 Executor。有具体的实现场景才能更好的理解
    autogen
        26
    autogen  
       2019-07-04 23:22:56 +08:00   3
    javaweb 高并发,

    一般是通过 CDN,负载均衡,缓存,读写分离,离线处理,合并请求,堆机器实现的。

    静态的页面交给 CDN 和 WEB 服务器,Java 只处理动态数据;

    对 DB 查询请求加缓存;

    DB 搞 1M 多 S,读从 Slave 读,减轻 Master 压力,甚至可以根据 hash(key)做分库,部署多个 M ;

    对统计类的操作,丢到 MQ 里,外挂一个程序离线处理;

    如果有很多类似的 Req,可以合并起来处理;

    在 Java 服务器前加一层 LVS,然后就可以无限堆机器了。

    另外,如果业务地之间距离比较远,比如一个在纽约一个在北京(或者一个用电信一个用联通),可以通过分 Set 的方式,在纽约和北京各部署一套完整的服务(或者在电信机房和联通机房各部署一套),用来加速纽约用户(联通用户)的访问速度。再用智能 DNS,自动给用户选择最近的服务器。


    -
    godoway
        27
    godoway  
       2019-07-05 09:37:32 +08:00
    tomcat 那种一个请求一条线程而且还是 BIO 弄高并发就是无限堆机器(当然也有 nio 模式)。
    真正要搞高并发必须要考虑 io 多路复用了,用 event-loop 异步模型代替。
    d23
        28
    d23  
       2019-07-07 21:14:47 +08:00 via Android
    @tcpdump 我怀疑你在开车
    .wwads-cn { border-radius: 3px !important; } .wwads-text { color: var(--link-color) !important; }
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2688 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 02:26 PVG 10:26 LAX 19:26 JFK 22:26
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86