笔记很零散, 除了我别人可能看不懂, 建议别浪费时间!!!!
电商商城项目第六天之数据同步解决方案:
一. 首页广告缓存更新:
1. 思路:
(1). index.html发出ajax请求本地缓存 - 访问openresty - nginx - ad_read.lua文件 - 读取redis缓存
(2). canal监控数据库 -- 发送到rabbitmq -- OkHttpClient调用 -- 更新缓存到redis
如下图:
2. 重点: service_business微服务, 监听广告更新消息 - 远程调用ad_updata.lua更新缓存
(1). 思路: 数据库数据发生改变, AdListener访问url地址 - 经过nginx - 访问 ad_update.lua文件 - lua文件读取mysql再更新缓存到redis
(2). 例子: 网站空闲时间更新缓存
//核心代码
@Component
public class AdListener {
@RabbitListener(queues = "ad_update_queue")
public void receiveMessage(String message){
System.out.println("接收到的消息为:"+message);
//发起远程调用
OkHttpClient okHttpClient = new OkHttpClient();
String url = "http://192.168.200.128/ad_update?position="+message;
Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//请求失败
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//请求成功
System.out.println("请求成功:"+response.message());
}
});
}
}
3. 注意:
当本地缓存openresty - nginx中有缓存时, 数据库更新的数据不会被读取到, 此时重启openresty: linux命令: systemctl restart openretsty
二. 商品上架索引导入数据库:
1.需求: 商品上架将商品的sku列表导入或更新索引库(Chrome插件ElasticSearch Header)
2.思路:
(1). 商品上架(is-marketable) - canal监听数据库 - 拿到商品spu - 发送消息队列到mq - 搜索服务(service_search)拿到消息spu - 根据spu查询sku集合 - 用search api存入索引库
(2). 根据spu查询sku: service_goods微服务中有查询方法, 需要提供feign接口远程调用得到sku列表
三. 两个BUG:
1. feign.FeignException: status 404 reading SkuFeign#findSkuListBySpuId(String)
原因: feign远程调用路径出错:
解决办法: 删除 @RequestMapping(/sku)
报错如图:
修改如图:
2. channel shutdown channel error: reply-text=NOT_FOUND - no exchange ‘topicExchage’ in vhost ‘/’, class-id=60, method-id=40)
原因: 如下图: 交换机名称出错
解决: 如下图: 更改spu监听器的交换机名称.
更改前:
更改后:
四. 注意:
导入索引库ElasticSearch Header时, 因为数据量大加载较慢