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

Java 有办法监控上传接口的网速么,或者能做一些策略进行网速控制么

  •  1
     
  •   luomao · 281 天前 · 2213 次点击
    这是一个创建于 281 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前在做的一个项目中有超大附件上传的需求,由于公司内网比较快,服务器的带宽经常会被几个人都打满,每次排查都会比较麻烦。于是我想是不是可以有什么方法给我进行一些预警提示,辟如超过 50Mbps 的时候,将当前操作的用户、接口地址、客户端 IP 啥的上报给我。或者是可以动态的限制网速,100Mbps 的内网,调用当前接口的人能动态分配一下各自的网速,留下一些带宽给其他服务。 GPT 给我讲了几个方案,可能是我问法不对,没有得到我想要的

    20 条回复    2024-02-02 10:26:45 +08:00
    ChovyChu
        1
    ChovyChu  
       281 天前   ❤️ 1
    nginx ?
    fenglangjuxu
        2
    fenglangjuxu  
       281 天前   ❤️ 1
    如果知道接口地址 可以在 NGINX 上配置吧
    iyiluo
        3
    iyiluo  
       281 天前   ❤️ 1
    不是有路由器么,路由器后台加个网速限制,专业的事情还得专业的设备来干
    luomao
        4
    luomao  
    OP
       281 天前
    @iyiluo #3 因为公司内走内网,外部访问走负载均衡,所以还是想直接在程序中监控和控制最好
    luomao
        5
    luomao  
    OP
       281 天前
    @fenglangjuxu #2 主要还想监控一下是哪个用户上传的
    cslive
        6
    cslive  
       281 天前   ❤️ 2
    多网卡,对其中一个限速,内网统一访问限速的网卡 ip ,这样你的服务带宽就不会打满了,想打满就用不限速的网卡 ip
    c2const
        7
    c2const  
       281 天前   ❤️ 1
    如果 Java 实现不了,用 C 和 C++呗 :)
    最多就是 Java 调用写好的库就行了 :)
    datocp
        8
    datocp  
       281 天前 via Android   ❤️ 1
    既然是内网服务器,
    一般是网管交换机限速吧,没实施过。。。
    如果是 linux 服务器,简单点可以用 iptable limit
    专业点那就是 tc 吧,tc 是可以通过 shell 进行动态插值实现动态限速的。当然简单点可以根据 ip 实施 prio 优先极实行有优先极的避让实现。
    zmaplex
        9
    zmaplex  
       281 天前   ❤️ 1
    给你一段我正在用的,非常好用。

    // $1 换成网卡接口名称
    tc qdisc del dev $1 root
    tc qdisc add dev $1 root handle 1: htb default 20

    // 限速 800 Mbs ,突发 4000 Mbs
    tc class add dev $1 parent 1:0 classid 1:1 htb rate 800mbit burst 4000mbit

    //使用随机公平队列 (sfq) 算法
    tc qdisc add dev $1 parent 1:1 handle 10: sfq
    tc filter add dev $1 parent 1: protocol ip prio 16 u32 match ip dst 0.0.0.0/0 flowid 1:1

    // 下面来自 AI 解释

    这是在创建一个分层队列规则,并使用随机公平队列( Stochastic Fairness Queue ,SFQ )算法。SFQ 是一种公平调度算法,旨在确保每个流都能获得公平的带宽份额,以避免某个流占用过多带宽而影响其他流。

    具体而言,这个命令在子类别 1:1 上创建了一个 SFQ 队列规则,其句柄为 10:。SFQ 会对数据包进行分类,然后按照一种随机的方式将它们放入队列中,以确保每个流获得相对均匀的带宽共享。

    总体而言,这些命令和配置表明你正在设置一个带有分层令牌桶和 SFQ 调度算法的 QoS 策略,用于对网络流量进行管理和控制。这有助于确保在网络上不同的流之间实现公平的带宽分配。
    991547436
        10
    991547436  
       281 天前   ❤️ 1
    单用户网速怎么看不知道,有个其他思路,可以在上传接口获取上传的文件大小和对方 ip ,如果文件过大,可以调用 iptable 去限制该用户的速度,传完解除限速,前提是获取对方的真实 ip ,而不是 nginx 代理的 ip
    28Sv0ngQfIE7Yloe
        11
    28Sv0ngQfIE7Yloe  
       281 天前   ❤️ 1
    舍本逐末了,直接从网卡着手就可以了
    159526aa
        12
    159526aa  
       281 天前   ❤️ 1
    需求还挺多 只有自己用 netty 写逻辑了
    fengpan567
        13
    fengpan567  
       281 天前   ❤️ 1
    加个日志不就行了,打印上传的用户信息和文件大小
    realrojeralone
        14
    realrojeralone  
       281 天前   ❤️ 1
    上传数据时是你代码接收的吗?是的话控制接收速度就可以了
    zsj1029
        15
    zsj1029  
       281 天前 via iPhone
    客户端做比较容易,或者用缓冲区流速控制
    1194129822
        16
    1194129822  
       281 天前   ❤️ 1
    看你用的什么框架,想要做到什么程度,业务层面上一般很难实现。
    4 层的 TCP 自带流量控制,只要控制 read 的速度,对面自然会降低发送的速度,nginx 和 netty 的流量控量就是基于此。
    4 层流量控制是基于连接,如果对面使用多线程,TCP 想要实现单机流量控制就比较麻烦一些。这时候使用网关和防火墙的基于 IP 流量控制就能实现单机流量控制。
    如果是分布式流量控制呢?基于用户,对接口限流,配合单机流量控制,等等。
    Richared
        17
    Richared  
       281 天前   ❤️ 1
    之前搞网关都是 openresty+lua 实现的,这些不用写在业务里吧。
    salmon5
        18
    salmon5  
       281 天前   ❤️ 1
    java 这一层不准,(默认)每一层 nginx 都会缓冲流量。
    比如用户上传了 1G 的文件,会缓存在 nginx 上,上传完成后,瞬间发给了 java 服务。
    Lentin
        19
    Lentin  
       280 天前 via iPhone
    加块网卡加根网线做个端口聚合不行吗……
    zliea
        20
    zliea  
       280 天前   ❤️ 2
    @salmon5 如果时大文件,ng 一般上会增加下边配置,不做缓存。
    proxy_buffering off;
    proxy_request_buffering off;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1047 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:11 · PVG 03:11 · LAX 11:11 · JFK 14:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.