V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xkxy
V2EX  ›  程序员

用 Java 实现 500 人及时聊天的功能,是不是只有 WebSocket 这种实现方式呢?求大佬给个思路

  •  1
     
  •   xkxy · Jan 7, 2021 · 6944 views
    This topic created in 1943 days ago, the information mentioned may be changed or developed.

    如题。

    Supplement 1  ·  Jan 7, 2021

    我这个系统是web端的,看大家的意思webSocket就够了。

    另外问一下,数据存储呢?有什么好的建议嘛?MySql???

    26 replies    2021-01-08 02:26:34 +08:00
    jiaokang
        1
    jiaokang  
       Jan 7, 2021
    MQTT
    Leigg
        3
    Leigg  
       Jan 7, 2021 via iPhone
    当然,不是了,了解一下长连接技术。
    woodensail
        4
    woodensail  
       Jan 7, 2021
    前端常用的推送方式分 4 种
    1:短轮询,也就是定期刷新,实时性无法保证,不适用于 IM
    2:长轮询,发起请求后服务端挂起,等有通知后返回数据。前端收到后立刻发起下一次请求。改动较小
    3:长连接,发起请求后服务端利用该连接多次返回数据。改动较大
    4:websocket,双工通信,体验完爆上面所有。开发难度也不大。
    manami
        5
    manami  
       Jan 7, 2021
    java 直接上 netty
    whileFalse
        6
    whileFalse  
       Jan 7, 2021
    如果你客户端是 web 页面,只能用 websocket (轮询或长链接也能实现,但效果性能差很多)
    如果客户端是 native,选择就多很多。
    xxxy
        7
    xxxy  
       Jan 7, 2021
    500 个 websocket 链接压力不大
    yfwl
        8
    yfwl  
       Jan 7, 2021
    调用第三方 SDK,万物皆可 API !
    lancelock
        9
    lancelock  
       Jan 7, 2021
    取决于你客户端
    opengps
        10
    opengps  
       Jan 7, 2021
    并没有限制,哪怕用轮训也并不是说不可以。websocket 只是在浏览器端比较轻巧而已。
    如果要做的客户端,那么显然直接使用 socket 更方便
    难点不在客户端,而在于服务端,怎么支持不限制(高支持≈不限制)客户端数量,各种异常处理,转发消息,头一次接手的人还是有很多细节要处理的
    hyxj1229
        11
    hyxj1229  
       Jan 7, 2021
    mango88
        12
    mango88  
       Jan 7, 2021
    openfire
    gochat
        13
    gochat  
       Jan 7, 2021
    genal
        14
    genal  
       Jan 7, 2021
    https://github.com/genaller/genal-chat 有个现成的 web 聊天系统,内网或者带宽够五百人是可以的,fiora 也不错
    firechat
        15
    firechat  
       Jan 7, 2021   ❤️ 1
    IM 要想做好需要花费非常多时间和精力,如果没有办法投入大量人力和时间,最好别自己来开发。可以选用云通讯平台,直接使用他们的 sdk 就行,也可以选择使用我们的 https://github.com/wildfirechat 私有部署,需要有一定的定制开发和运维能力,需要付费,可以先试用后购买。
    hantsy
        16
    hantsy  
       Jan 7, 2021
    web socket 处理这点小意思啊,不过后面的 Web socket session 处理需要另外缓冲处理( Redis 等)。客户端也容易,Android,WebSocket 都是很容易支持。


    简单的 WebSocket 例子:

    https://github.com/hantsy/angular-spring-websocket-sample

    RSocket 例子:

    https://github.com/hantsy/angular-spring-rsocket-sample

    SSE+ 普通 HTTP Post (这个比较简单,也容易处理):

    https://github.com/hantsy/angular-spring-sse-sample
    hantsy
        17
    hantsy  
       Jan 7, 2021
    喜欢挑战,可以试用 RSocket,各种语言支持也很好。

    https://github.com/rsocket
    hantsy
        18
    hantsy  
       Jan 7, 2021
    另外对于聊天这种程序,要求即时响应,文本居本,Key/value 数据库是更好的选择。

    我开发过一个 Angular+Firebase 项目,Firebase 本身的 JS API 都基于 WebSocket 协议的,所以感觉这也是个不错的选择。Firebase 官方还有专门的 Chat UI 扩展。
    chinvo
        19
    chinvo  
       Jan 7, 2021 via iPhone
    直接 ejabberd
    oxromantic
        20
    oxromantic  
       Jan 7, 2021
    500 人聊天?自己做还不如花钱一个月 999 有成吨的供应商
    azuremem
        21
    azuremem  
       Jan 7, 2021
    rabbitmq 貌似可以
    iintothewind
        22
    iintothewind  
       Jan 7, 2021 via iPhone
    用 mqtt 就可以,可以参考我的:
    https://home-chat.vercel.app
    不过不是 Java 项目,后端不需要代码,只需要 mqtt 的服务就可以了
    hantsy
        23
    hantsy  
       Jan 7, 2021
    @azuremem RabbitMQ + STOMP + SockJS 这是个经典组合。除了 NodeJS 的 SocketIO 外。
    GBdG6clg2Jy17ua5
        24
    GBdG6clg2Jy17ua5  
       Jan 7, 2021 via iPhone
    500 人,直接短轮询
    Goat121
        25
    Goat121  
       Jan 7, 2021
    500 人随便啥都行,webSocket 最简单。
    上面还有 RabbitMQ 都来了,面试八股文看多了把。
    如果是需要 MQ 的量级,还用这些?
    哪个巨型 IM 不是 tcp/udp 上实现的私有协议啊
    xcstream
        26
    xcstream  
       Jan 8, 2021
    mqtt broker 可以单独启动
    java 可以做业务端连接 mqtt 提供服务
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2318 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 90ms · UTC 15:51 · PVG 23:51 · LAX 08:51 · JFK 11:51
    ♥ Do have faith in what you're doing.