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

一个生产者消费者问题

  •  1
     
  •   sununiq · 24 天前 · 782 次点击
    目前有这样一个场景,每次会以文件流的形式推送一批数据(大概 500W 条)给服务器解析入库,该数据会先保存在磁盘上。因为读取数据到内存解析比较快,入库是 IO 操作比较慢,所以目前想到的思路是采用单生产者多消费者模型,其中多消费者采用线程池管理,Java 中使用 BlockingQueue 来做中间管道。

    目前有这么一个需求,如果其中一个消费者入库出现异常,需要通知其他消费者停止消费,同时还要告知生产者放弃解析这批数据,直到下一批数据过来在此解析,请问下这种有什么好的方式来实现?
    6 回复  |  直到 2018-01-12 20:37:16 +08:00
        1
    zhx1991   24 天前
    不同数据本身有特征(比如 id)可以分开吗?

    同类的数据(比如相同的 id, 需要严格保持先后顺序)可以走同一个管道, 然后这样某个管道挂了别的管道也依然可以正常处理别的数据
        2
    qk3z   24 天前
    生产者和消费者共用一个标识符,生产者在每次解析的时候判断,消费者在每次入库的时候判断,但是这样感觉性能跟不上啊 -_-!
        3
    sununiq   23 天前
    @zhx1991 需求就是出现问题,整个这批数据都不处理
        4
    sununiq   23 天前
    @qk3z 是啊,没有想到啥好办法
        5
    crossoverJie   4 天前
    实时性要求高嘛?可以借助 MQ 失败之后发个消息,所有线程收到这个消息后停止工作。
        6
    sununiq   4 天前
    @crossoverJie 实时性要求不高,但是增加组件的话会增加整个系统的复杂度,有没有其他不增加其他组件的方法?
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2044 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 49ms · UTC 12:59 · PVG 20:59 · LAX 04:59 · JFK 07:59
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1