畅购06—— 广告数据同步(Canal和MQ技术)

    科技2024-10-09  23

    电商项目——CG

    1.canal原理2.搭建canal微服务3.1广告缓存更新

    1.canal原理

      

    canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议mysql master收到dump请求,开始推送binary log给slave(也就是canal)canal解析binary log对象(原始为byte流)

    2.搭建canal微服务

    第五天我们已经用nginx和lua实现了只需输入地址请求就可以完成首页的部署和广告的更新,但如何用代码进行实时更新呢?

    思路: canal伪装成mysql slave,监听tb_ad表。定义mq配置,简单模式即可,只要表中数据改变,mq立马发送消息,内容为position的值。定义一个mq监听,此队列一旦有新消息,立马执行更新广告数据的操作。

    具体操作:

    创建微服务模块,pom文件中引入starter-canal依赖定义启动类,配上注解@EnableCanalClient声明此为canal客户端添加配置文件application.properties,canal中已配置监听哪个数据库 canal.client.instances.example.host=192.168.200.128 canal.client.instances.example.port=11111 canal.client.instances.example.batchSize=1000 spring.rabbitmq.host=192.168.200.128 创建mq配置类,根据业务可能需要配置多个消息队列

    3.1广告缓存更新

    在canal微服务中编写BusinessListener类,代码如下: @CanalEventListener public class BusinessListener { @Autowired private RabbitTemplate rabbitTemplate; /** * * @param eventType 当前操作数据库的类型 * @param rowData 当前操作数据库的数据 */ @ListenPoint(schema = "changgou_business",table = "tb_ad") //schema指定库,table指定表 public void adUpdate(CanalEntry.EventType eventType,CanalEntry.RowData rowData){ //改变前的数据 rowData.getBeforeColumnsList().forEach((c)-> System.out.println("每个队列的值:"+c.getName()+":"+c.getValue())); System.out.println("------------------------"); //改变后的数据 List<CanalEntry.Column> columnsList = rowData.getAfterColumnsList(); for (CanalEntry.Column column : columnsList) { if ("position".equals(column.getName())){ rabbitTemplate.convertAndSend("",RabbitMQConfig.AD_UPDATE_QUEUE,column.getValue()); } } } } mq消费端yml配置在spring下加上rabbitmq配置,编写listener类,代码如下:推荐法2 @Component public class AdListener { @Autowired private RestTemplate restTemplate; @RabbitListener(queues="ad_update_queue") public void receiveMessage(String message){ //方法1:okhttp不做赘述,见源码 //方法2 restTemplate String url="http://192.168.200.128/ad_update?position="+message; String str = restTemplate.getForObject(url, String.class); System.out.println(str); } }
    Processed: 0.346, SQL: 8