数据同步

98 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

每日英语:

One of the great joys of life is its wondrous unpredictability.

翻译:生命最大的乐趣之一就在于其神奇的不可预测性。 ——《老友记》

数据同步

数据同步不仅仅是将数据库数据同步到ES中,还要实时更新静态页,我们来分析下实现方案。

数据同步方案

1609791728137.png

数据同步方案如上图:

1:秒杀服务更新商品信息到数据库
2:Canal监听数据库变化,数据同步服务消费增量变化
3:数据同步服务根据变化调用搜索服务实现数据同步
4:数据同步服务根据变化调用静态页服务实现静态页同步

数据同步实现

Canal监听配置

修改canal配置,添加seckill_goodsseckill_activity表的监听,并重启canal,如下图:

1609792084488.png

同步实现

1)JPA映射配置

修改SeckillGoods添加JPA注解,实现列名和属性名不同映射,代码如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
//MyBatisPlus表映射注解
@TableName(value = "seckill_goods")
@Table
public class SeckillGoods {
​
    @TableId(type = IdType.ASSIGN_UUID)
    private String id;
    @Column(name = "sup_id")
    private String supId;
    @Column(name = "sku_id")
    private String skuId;
    private String name;
    private String images;
    private String content;
    private Integer price;
    @Column(name = "seckill_price")
    private Integer seckillPrice;
    private Integer num;
    @Column(name = "store_count")
    private Integer storeCount;
    @Column(name = "activity_id")
    private String activityId;
}

修改mall-canal-service添加com.xz.canal.listener.SeckillGoodsHandler并调用搜索服务行业静态页服务实现静态页生成和索引创建,代码如下:

@CanalTable(value = "seckill_goods")
@Component
public class SeckillGoodsHandler implements EntryHandler<SeckillGoods>{
​
    @Autowired
    private SeckillGoodsSearchFeign seckillGoodsSearchFeign;
​
    @Autowired
    private SeckillPageFeign seckillPageFeign;
​
    /**
     * 增加数据
     * @param seckillGoods
     */
    @SneakyThrows
    @Override
    public void insert(SeckillGoods seckillGoods) {
        //静态页生成
        seckillPageFeign.page(seckillGoods.getId());
        //索引生成
        seckillGoodsSearchFeign.add(JSON.parseObject(JSON.toJSONString(seckillGoods), SeckillGoodsEs.class));
    }
​
    @SneakyThrows
    @Override
    public void update(SeckillGoods before, SeckillGoods after) {
        //静态页生成
        seckillPageFeign.page(after.getId());
        //索引生成
        seckillGoodsSearchFeign.add(JSON.parseObject(JSON.toJSONString(after), SeckillGoodsEs.class));
    }
​
    @Override
    public void delete(SeckillGoods seckillGoods) {
    }
}

总结

本篇主要介绍了一下数据同步方案和具体的数据同步实现。