有个高并发接口,需要即时获取访问者的 ip 信息 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
caiem
V2EX    程序员

有个高并发接口,需要即时获取访问者的 ip 信息

  •  
  •   caiem 2018-09-17 15:02:35 +08:00 4311 次点击
    这是一个创建于 2580 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前解决方案是查 ip 地址 mysql 数据库,然后即时返回.目前发现压力有点大. 还有啥更简单靠谱快速的解决方法. 目前考虑即再开启单独长驻内存的服务,将 ip 数据一次性读取内存,调用 rpc 方式供各个公司内部服务获取

    19 条回复    2018-09-18 10:12:07 +08:00
    opengps
        1
    opengps  
       2018-09-17 16:04:44 +08:00
    应用层使用内存读取方法没错

    看起来你的需求只是需要读取数据库,你可以多台机器,多台一模一样的数据库(数据库直接在机器内部也行,单独实例连接也行)
    lhy360121
        2
    lhy360121  
       2018-09-17 16:12:27 +08:00
    缓存。 比如用 redis
    lshero
        3
    lshero  
       2018-09-17 16:18:42 +08:00
    如果单纯为了返回 IP 归属地之类的信息不如参考使用 https://caddyserver.com/docs/http.geoip
    caiem
        4
    caiem  
    OP
       2018-09-17 16:33:45 +08:00
    @lshero 这个 ip 数据库我们内部有一定的维护及修改,没法直接用第三方
    hosaos
        5
    hosaos  
       2018-09-17 16:36:34 +08:00
    直接读到内存里 或者 redis 里
    PazuLee
        6
    PazuLee  
       2018-09-17 16:38:02 +08:00
    @caiem 是不是得分析下调用场景是否适合缓存?如果每次查询都不一样那还得考虑内存大小的问题。
    tempdban
        7
    tempdban  
       2018-09-17 16:39:00 +08:00 via Android
    ip 这种不是写个最长匹配表?参考路由查找下一跳 mac
    sampeng
        8
    sampeng  
       2018-09-17 18:50:10 +08:00
    你自己有 ip 库。。分分钟写一个 ip 查询的 rpc 服务就完事了。算法都很简单二分查找就足够快了(加载的时候排好序)。
    用动态语言,每访问一次查一次肯定慢死。
    redis 可以是可以。但也很奇怪。因为 ip 库一般是 ip 段。没法真正的 hash 查询。还是走了一圈前缀匹配。
    likuku
        9
    likuku  
       2018-09-17 20:24:17 +08:00
    mysql 也不是不可以,有个好东西叫 memcache 很早以前就有了
    xuanbg
        10
    xuanbg  
       2018-09-17 20:34:04 +08:00
    @sampeng 掩码了解一下
    rrfeng
        11
    rrfeng  
       2018-09-17 20:34:08 +08:00 via Android
    IP 库只有几兆大,可以加到内存里去。起个服务 RPC 也行。

    参考 ipip 的数据结构
    wb14123
        12
    wb14123  
       2018-09-17 20:39:28 +08:00 via Android
    字典树了解一下
    gaoyulong
        13
    gaoyulong  
       2018-09-17 23:31:43 +08:00 via Android
    我们也有这个需求,早期的时候直接调用外部服务,峰值高的时候直接把对方网站拖垮了
    Raymon111111
        14
    Raymon111111  
       2018-09-17 23:49:29 +08:00
    可以内存+ redis

    内存用 lru 类似的算法就行了
    Cbdy
        15
    Cbdy  
       2018-09-18 07:09:34 +08:00 via Android
    MySQL 放内存里跑
    opengps
        16
    opengps  
       2018-09-18 08:10:26 +08:00 via Android
    换个思路,给题主提个优化建议,存 ip 用数字 ip
    collinswang
        17
    collinswang  
       2018-09-18 09:13:37 +08:00
    难道不是和产品怼一下,要求把功能下放到二级菜单吗?
    reus
        18
    reus  
       2018-09-18 09:54:07 +08:00
    mysql 一样会把数据放内存。
    byteli
        19
    byteli  
       2018-09-18 10:12:07 +08:00 via Android
    看你们多大的 ip 数据,我之前有一千六百万行的 ip 数据大概不到 2 个 G,自己把信息预处理下抽出来写成个 raw 文件压缩成 200M 以方便程序载入。然后就是载入数据到 stl map 里内存直接查。因为与预处理过所以载入时间 5s 内,内存占用记不清了大概不到 500M。

    上面是资源消耗,还要看 qps 要求,因为我需要至少 3W 的 qps 所以直接把逻辑集成到调用者进程了。因为查询逻辑简单,所以如果做成 rpc 服务的话,准备几个核+不到 1G 内存应该就能逼近单机 RPC 框架的上限了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5286 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 09:06 PVG 17:06 LAX 02:06 JFK 05:06
    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