V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yanshenxian
V2EX  ›  问与答

请教下 一对 N 数据表同步的场景怎么提高并发性能

  •  
  •   yanshenxian · 2020-06-14 18:39:08 +08:00 · 591 次点击
    这是一个创建于 1404 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一对 N 指的是一张原始记录表 (raw_record_table) 需要同步数据到 N 张不同维度的业务数据表 (business_table_1, ...business_table_n) (同步为增量更新操作), 这些业务表都有一个相同的业务关连键 (比如 userId)

    我现在想到了两个方案
    方案 1: 多个线程根据 userId 取模 并发读取 raw_record_table, 每个线程读取的范围是确定的, 这样同步操作在单个线程里面不需要竞争
    方案 2: 多个线程无限制并发读取 raw_record_table, 这样在接下来同步操作可能存在竞争, 需要加锁保证正确性

    方案 1 的并发能力和取模数有关, 并且如果 userId 分布不均匀, 性能可能更差
    方案 2 加锁可能开销大

    请教下这两个场景应该怎么选择呢, 有没有更好的方案可以解决这个问题

    3 条回复    2020-06-15 10:29:41 +08:00
    taoprogramer
        1
    taoprogramer  
       2020-06-15 09:48:24 +08:00
    单线程读 mysql 写到 kakfa,通过 kafka 的多个分区来并发写你那个业务表
    yanshenxian
        2
    yanshenxian  
    OP
       2020-06-15 10:12:28 +08:00
    @taoprogramer 没太明白,请问应该怎么设置分区规则和消费呢。。如果是直接按照 user_id 分区,这个应该和方案一是一样的吧
    taoprogramer
        3
    taoprogramer  
       2020-06-15 10:29:41 +08:00
    @yanshenxian 按主键分区就行了,可以做到比较均匀,你按 user_id 分片不能用户的不是不一样么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3630 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:28 · PVG 18:28 · LAX 03:28 · JFK 06:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.