持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
每日英语:
One of the great joys of life is its wondrous unpredictability.
翻译:生命最大的乐趣之一就在于其神奇的不可预测性。 ——《老友记》
数据同步
数据同步不仅仅是将数据库数据同步到ES中,还要实时更新静态页,我们来分析下实现方案。
数据同步方案
数据同步方案如上图:
1:秒杀服务更新商品信息到数据库
2:Canal监听数据库变化,数据同步服务消费增量变化
3:数据同步服务根据变化调用搜索服务实现数据同步
4:数据同步服务根据变化调用静态页服务实现静态页同步
数据同步实现
Canal监听配置
修改canal配置,添加seckill_goods和seckill_activity表的监听,并重启canal,如下图:
同步实现
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) {
}
}
总结
本篇主要介绍了一下数据同步方案和具体的数据同步实现。