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

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

  •  
  •   Midnight17 · 2019-07-03 22:04:05 +08:00 · 6942 次点击
    这是一个创建于 1730 天前的主题,其中的信息可能已经有所发展或是发生改变。
    遇到 java 的面试,怎么用线程池,我连个例子都找不到。虽然有很多高并发设计的书。 我怎么才能在百万级流量入门。
    28 条回复    2019-07-07 21:14:47 +08:00
    weiqk
        1
    weiqk  
       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
    框架里头用了
    oneisall8955
        17
    oneisall8955  
       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 我怀疑你在开车
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5415 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 85ms · UTC 07:50 · PVG 15:50 · LAX 00:50 · JFK 03:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.