电商项目-数据同步解决方案(四)商品下架同步更新ES索引库数据

商品下架索引库删除数据

一、 需求分析和业务逻辑

商品下架后将商品从索引库中移除。

主要应用技术有: 消息队列-RabbitMQ ,分布式搜索引擎-ElasticSearch,Eureka,Canal,Feign远程调用

(1)在数据监控微服务中监控tb_spu表的数据,当tb_spu发生更改且is_marketable为0时,表示商品下架,将spu的id发送到rabbitmq。

(2)在rabbitmq管理后台创建商品下架交换器(fanout)。使用分列模式的交换器是考虑商品下架会有很多种逻辑需要处理,索引库删除数据只是其中一项,另外还有删除商品详细页等操作。

(3)搜索微服务从rabbitmq的的队列中提取spu的id,通过调用elasticsearch的高级restAPI 将相关的sku列表从索引库删除。

二、 代码实现

商品下架删除ES索引库数据的功能实现:

主要应用技术有: 消息队列-RabbitMQ ,分布式搜索引擎-ElasticSearch,Eureka,Canal,Feign远程调用

2.1 创建交换器与队列

完成商品下架交换器的创建,队列的创建与绑定,将spuId发送消息到mq

商品下架交换器:goods_down_exchange

队列名称: search_delete_queue

绑定 search_delete_queue到goods_down_exchange

java 复制代码
@Configuration
public class RabbitMQConfig {
​
    //定义交换机名称
    public static final String GOODS_UP_EXCHANGE="goods_up_exchange";
    public static final String GOODS_DOWN_EXCHANGE="goods_down_exchange";
​
    //定义队列名称
    public static final String AD_UPDATE_QUEUE="ad_update_queue";
    public static final String SEARCH_ADD_QUEUE="search_add_queue";
    public static final String SEARCH_DEL_QUEUE="search_del_queue";
​
    //声明队列
    @Bean
    public Queue queue(){
        return new Queue(AD_UPDATE_QUEUE);
    }
    @Bean(SEARCH_ADD_QUEUE)
    public Queue SEARCH_ADD_QUEUE(){
        return new Queue(SEARCH_ADD_QUEUE);
    }
    @Bean(SEARCH_DEL_QUEUE)
    public Queue SEARCH_DEL_QUEUE(){
        return new Queue(SEARCH_DEL_QUEUE);
    }
​
    //声明交换机
    @Bean(GOODS_UP_EXCHANGE)
    public Exchange GOODS_UP_EXCHANGE(){
        return ExchangeBuilder.fanoutExchange(GOODS_UP_EXCHANGE).durable(true).build();
    }
    @Bean(GOODS_DOWN_EXCHANGE)
    public Exchange GOODS_DOWN_EXCHANGE(){
        return ExchangeBuilder.fanoutExchange(GOODS_DOWN_EXCHANGE).durable(true).build();
    }
​
​
    //队列与交换机的绑定
    @Bean
    public Binding GOODS_UP_EXCHANGE_BINDING(@Qualifier(SEARCH_ADD_QUEUE)Queue queue,@Qualifier(GOODS_UP_EXCHANGE)Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("").noargs();
    }
    @Bean
    public Binding GOODS_DOWN_EXCHANGE_BINDING(@Qualifier(SEARCH_DEL_QUEUE)Queue queue,@Qualifier(GOODS_DOWN_EXCHANGE)Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("").noargs();
    }
​
}

2.2 canal监听下架

修改changgou_canal的SpuListener的spuUpdate方法,添加以下代码

java 复制代码
//获取最新下架的商品 1->0
if ("1".equals(oldData.get("is_marketable")) && "0".equals(newData.get("is_marketable"))){
    //将商品的spuid发送到mq
    rabbitTemplate.convertAndSend(RabbitMQConfig.GOODS_DOWN_EXCHANGE,"",newData.get("id"));
}

2.3 根据spuId删除索引数据

编写业务逻辑,实现根据spuId删除索引库数据的方法。

(1)ESManagerService新增方法定义

java 复制代码
//根据souid删除es索引库中相关的sku数据
void delDataBySpuId(String spuId);

(2)ESManagerServiceImpl实现方法

java 复制代码
@Override
public void delDataBySpuId(String spuId) {
    List<Sku> skuList = skuFeign.findSkuListBySpuId(spuId);
    if (skuList == null || skuList.size()<=0){
        throw new RuntimeException("当前没有数据被查询到,无法导入索引库");
    }
    for (Sku sku : skuList) {
        esManagerMapper.deleteById(Long.parseLong(sku.getId()));
    }
}

2.4 接收mq消息,执行索引库删除

从rabbitmq中提取消息,调动根据spuId删除索引库数据的方法 changgou_service_search新增监听类

java 复制代码
@Component
public class GoodsDelListener {
​
    @Autowired
    private ESManagerService esManagerService;
​
    @RabbitListener(queues = RabbitMQConfig.SEARCH_DEL_QUEUE)
    public void receiveMessage(String spuId){
        System.out.println("删除索引库监听类,接收到的spuId:  "+spuId);
​
        //调用业务层完成索引库数据删除
        esManagerService.delDataBySpuId(spuId);
    }
}
相关推荐
TOPGUS3 小时前
黑帽GEO手法揭秘:AI搜索阴影下的新型搜索劫持与风险
人工智能·搜索引擎·chatgpt·aigc·谷歌·数字营销
AI猫站长5 小时前
快讯|腾讯ULTRALOGIC用“负分奖励”训练推理,北航SIAMD用“结构信息”反制AI水军,AI治理技术能否跟上AI生成技术的步伐?
人工智能·搜索引擎
Elasticsearch7 小时前
在 ES|QL 中的混合搜索和多阶段检索
elasticsearch
AC赳赳老秦9 小时前
量化交易脚本开发:DeepSeek生成技术指标计算与信号触发代码
数据库·elasticsearch·信息可视化·流程图·数据库架构·memcached·deepseek
Elastic 中国社区官方博客9 小时前
使用 Elastic Agent Builder 和 MCP 实现 Agentic 参考架构
大数据·人工智能·elasticsearch·搜索引擎·ai·架构·全文检索
予枫的编程笔记10 小时前
Elasticsearch深度搜索与查询DSL实战:精准定位数据的核心技法
java·大数据·人工智能·elasticsearch·搜索引擎·全文检索
予枫的编程笔记11 小时前
Elasticsearch聚合分析与大规模数据处理:解锁超越搜索的进阶能力
java·大数据·人工智能·分布式·后端·elasticsearch·全文检索
我是海飞11 小时前
Git 本地仓库推送到远程空仓库指南
大数据·git·elasticsearch
better_liang11 小时前
每日Java面试场景题知识点之-ELK技术栈实战应用
java·elk·elasticsearch·kibana·logstash·日志分析·企业级应用
摇滚侠11 小时前
两句话理解 ElasticSearch 搜索引擎数据库的作用
数据库·mysql·搜索引擎