ES与MySQL数据同步实现方式

news2024/9/22 4:21:46

1.什么是数据同步:

1.Elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,Elasticsearch也必须跟着改变,这个就是Elasticsearch与mysql之间的数据同步
在这里插入图片描述

2.数据同步实现方式:

常见的数据同步方案有三种

  • 同步调用
  • 异步通知
  • 监听binlog

2.1.同步调用:

a.解决架构图:

  • 1.方案一:同步调用:
    在这里插入图片描述
  • 2.基本步骤如下:
    • hotel-demo对外提供接口,用来修改elasticsearch中的数据
    • 酒店管理服务在完成数据库操作后,直接调用hotel-demo提供的接口,

b.优缺点分析:

  • 优点:实现简单,粗暴
  • 缺点:业务耦合度高

2.2.异步通知

a.实现的架构图:

  • 1.方案二:异步通知
    在这里插入图片描述
  • 2.流程如下:
    • hotel-admin对mysql数据库数据完成增、删、改后,发送MQ消息
    • hotel-demo监听MQ,接收到消息后完成Elasticsearch数据修改

b.优缺点分析:

  • 优点:低耦合,实现难度一般
  • 缺点:依赖mq的可靠性

2.3.监听binlog:

a.实现的架构图:

  • 1.方案三:监听binlog
    在这里插入图片描述
  • 2.流程如下:
    • 给mysql开启binlog功能
    • mysql完成增、删、改操作都会记录在binlog中
    • hotel-demo基于canal监听binlog变化,实时更新elasticsearch中的内容

b.优缺点分析:

  • 优点:完全解除服务间耦合
  • 缺点:开启binlog增加数据库负担、实现复杂度高

3.MQ实现MySQL与Es的数据同步:

3.1.案例说明:

  • 1.导入hotel-admin项目作为酒店管理的微服务。然后当酒店数据发生增、删、改时,要求对Elasticsearch中数据也要完成相同操作

3.2.实现步骤:

a.酒店管理项目的运行:

  • 1.导入hotel-admin项目并运行,启动并测试酒店数据的CRUD,运行后,访问 http://localhost:8099
    在这里插入图片描述
  • 2.其中包含了酒店的CRUD功能:
    在这里插入图片描述

b.项目引入ES依赖:

  • 1.在hotel-admin、hotel-demo中引入rabbitmq的依赖:
    <!--amqp-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    

c.MQ架构规划:

  • 1.使用RabbitMQ,然后MQ结构如下图,声明exchange、queue、RoutingKey
    在这里插入图片描述
  • 2.声明队列交换机名称:在hotel-admin和hotel-demo中的cn.itcast.hotel.constatnts包下新建一个类MqConstants
    package cn.itcast.hotel.constatnts;
    
        public class MqConstants {
        /**
         * 交换机
         */
        public final static String HOTEL_EXCHANGE = "hotel.topic";
        /**
         * 监听新增和修改的队列
         */
        public final static String HOTEL_INSERT_QUEUE = "hotel.insert.queue";
        /**
         * 监听删除的队列
         */
        public final static String HOTEL_DELETE_QUEUE = "hotel.delete.queue";
        /**
         * 新增或修改的RoutingKey
         */
        public final static String HOTEL_INSERT_KEY = "hotel.insert";
        /**
         * 删除的RoutingKey
         */
        public final static String HOTEL_DELETE_KEY = "hotel.delete";
    }
    
  • 3.声明队列交换机在hotel-demo中,定义配置类,声明队列、交换机:
    package cn.itcast.hotel.config;
    
    import cn.itcast.hotel.constants.MqConstants;
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.Queue;
    import org.springframework.amqp.core.TopicExchange;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MqConfig {
        @Bean
        public TopicExchange topicExchange(){
            return new TopicExchange(MqConstants.HOTEL_EXCHANGE, true, false);
        }
    
        @Bean
        public Queue insertQueue(){
            return new Queue(MqConstants.HOTEL_INSERT_QUEUE, true);
        }
    
        @Bean
        public Queue deleteQueue(){
            return new Queue(MqConstants.HOTEL_DELETE_QUEUE, true);
        }
    
        @Bean
        public Binding insertQueueBinding(){
            return BindingBuilder.bind(insertQueue()).to(topicExchange()).with(MqConstants.HOTEL_INSERT_KEY);
        }
    
        @Bean
        public Binding deleteQueueBinding(){
            return BindingBuilder.bind(deleteQueue()).to(topicExchange()).with(MqConstants.HOTEL_DELETE_KEY);
        }
    }
    

d.生产者发送消息:

  • 1.发送MQ消息:在hotel-admin中的增、删、改业务中分别发送MQ消息:
    在这里插入图片描述

e.消费端接收消息:

  • 1.接收MQ消息:hotel-demo接收到MQ消息要做的事情包括:
    • 新增消息:根据传递的hotel的id查询hotel信息,然后新增一条数据到索引库
    • 删除消息:根据传递的hotel的id删除索引库中的一条数据
  • 1.首先在hotel-demo的cn.itcast.hotel.service包下的IHotelService中新增新增、删除业务
    void deleteById(Long id);
    
    void insertById(Long id);
    
    • 2.给hotel-demo中的cn.itcast.hotel.service.impl包下的HotelService中实现业务:
    @Override
    public void deleteById(Long id) {
        try {
            // 1.准备Request
            DeleteRequest request = new DeleteRequest("hotel", id.toString());
            // 2.发送请求
            client.delete(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    
    @Override
    public void insertById(Long id) {
        try {
            // 0.根据id查询酒店数据
            Hotel hotel = getById(id);
            // 转换为文档类型
            HotelDoc hotelDoc = new HotelDoc(hotel);
    
            // 1.准备Request对象
            IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
            // 2.准备Json文档
            request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
            // 3.发送请求
            client.index(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    
  • 3.编写监听器:在hotel-demo中的cn.itcast.hotel.mq包新增一个类:
    package cn.itcast.hotel.mq;
    
    import cn.itcast.hotel.constants.MqConstants;
    import cn.itcast.hotel.service.IHotelService;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class HotelListener {
    
        @Autowired
        private IHotelService hotelService;
    
        /**
         * 监听酒店新增或修改的业务
         * @param id 酒店id
         */
        @RabbitListener(queues = MqConstants.HOTEL_INSERT_QUEUE)
        public void listenHotelInsertOrUpdate(Long id){
            hotelService.insertById(id);
        }
    
        /**
         * 监听酒店删除的业务
         * @param id 酒店id
         */
        @RabbitListener(queues = MqConstants.HOTEL_DELETE_QUEUE)
        public void listenHotelDelete(Long id){
            hotelService.deleteById(id);
        }
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2020 位示图

假设某计算机的字长为32位&#xff0c;该计算机文件管理系统磁盘空间管理采用位示图&#xff08;bitmap&#xff09;&#xff0c;记录磁盘的使用情况。若磁盘的容量为300GB&#xff0c;物理块的大小为4MB&#xff0c;那 么位示图的大小为&#xff08; &#xff09;个字。 要计…

【SQL】仅出现一次的最大数据

目录 题目 分析 代码 题目 MyNumbers 表&#xff1a; ------------------- | Column Name | Type | ------------------- | num | int | ------------------- 该表可能包含重复项&#xff08;换句话说&#xff0c;在SQL中&#xff0c;该表没有主键&#xff09;。…

一个轻量级的数据库条件检索引擎,专门设计来简化后端查询逻辑的开发,专注高级查询的只读 ORM 工具(附源码)

前言 在软件开发过程中&#xff0c;后端开发者经常面临着复杂多变的数据库查询需求。产品经理和项目经理可能会频繁地提出新的查询条件&#xff0c;要求支持各种模糊查询、直接查询&#xff0c;甚至需要在用户界面上提供下拉列表等元素&#xff0c;以增强用户体验。 然而&…

进阶SpringBoot之 Druid 数据源

Druid 是开源平台上一个数据库连接池实现&#xff0c;具备日志监控功能 Druid 可以很好的监控 DB 连接池和 SQL 的执行情况&#xff0c;天生就是针对监控而生的 DB 连接池 Maven 仓库 pom.xml 文件导入 Durid 的 jar 包 <!-- Druid依赖 --><dependency><grou…

前端视角解决chrome/firefox浏览器访问国家税务局发票查验平台验证码获取提示”网络异常,请稍后再试“解决方法

目录 问题描述问题原因解决办法 问题描述 chrome等浏览器访问国家税务局发票查验平台时获取验证码提示”网络异常&#xff0c;请稍后再试“&#xff0c;安装根证书、信任根证书也无效 问题原因 使用开发者工具查看执行过程&#xff0c;点击获取验证码后ajax请求地方税务局的…

嵌入式AI快速入门课程-K510篇 (一)

嵌入式AI快速入门课程-K510篇 手册属性 属性描述类别嵌入式AI开发文档名嵌入式AI快速入门手册-K510篇当前版本1.0适用型号DongshanPI-Vision编辑百问科技文档编辑团队审核韦东山 更新记录 更新日期更新内容更新版本2023/11/09文档大纲编写完毕V1.0 文章目录 嵌入式AI快速入门课…

如何培养单元测试的习惯?怎样才算一个好的单元测试?

你是怎么编写单元测试的呢&#xff1f;很多人的做法是先把所有的功能代码都写完&#xff0c;然后&#xff0c;再针对写好的代码一点一点地补写测试。 在这种编写测试的做法中&#xff0c;单元测试扮演着非常不受人待见的角色。你的整个功能代码都写完了&#xff0c;再去写测试…

C语言:顺序表的实现和通迅录项目实现

顺序表 1、顺序表的概念及结构 1.1 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构&#xff0c;常⻅的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&…

openstack基本操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

python语言day9 正则表达式 和 xpath 解析html

正则表达式&#xff1a; 正则表达式的语法&#xff1a; 元字符&#xff1a; \D \d \w \W . [ ] 量词&#xff1a; ? * 惰性匹配&#xff1a; 玩儿(?P<name>.*?)游戏&#xff1a; 匹配到第一个游戏结束&#xff0c;name 匹配的文本。 玩儿(?P<na…

分享cesium的风场开源网站

首先是有在二维地图上的一个风场效果&#xff0c;通过canvas进行的绘制&#xff0c;例如leaflet开源地图上就能够根据数据生成风场的效果图。 最近mapbox里的大神分享了如何在cesium上实现风场的效果&#xff0c;并在github上进行了开源&#xff0c;开源地址: https://github.…

SSL Pining 问题解决方案

实战案例 为了能够更好的复现 SSL Pining 场景&#xff0c;我们对一个 App&#xff08;https:app4.scrape.center&#xff09;进行抓包&#xff0c;这个 App 包含了 SSL Pining 的相关设置&#xff0c;如果我们将手机的代理设置为抓包软件提供的代理服务&#xff0c;那么这个 …

Windows 11上RTX 4090深度学习与大模型微调环境安装指南

【本文原作者&#xff1a;擎创科技资深产品专家 布博士】 在安装深度学习及大模型微调环境时&#xff0c;经历了多次反复操作&#xff08;如CUDA、cuDNN、PyTorch的安装与卸载&#xff09;。为了避免走弯路&#xff0c;总结了以下步骤&#xff1a; 步骤 1&#xff1a;显卡驱动…

【轨物方案】直流电源屏物联网解决方案,让在线监测更简单!

流屏是保证各类变电站、水力、火力发电厂正常、安全运行的电源设备&#xff0c;也是其它使用直流设备用户(如石化、矿山、铁路、医院等)的直流电源&#xff0c;是电力系统的重要组成部分。同时直流屏在变配电中&#xff0c;发挥着很大的作用&#xff0c;它在很大程度上影响着配…

Waymo第六代无人驾驶技术亮相:更少传感器,更高效率

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【系统分析师】-综合知识-数据库基础

1、给定关系模式 R < U &#xff0c;F >&#xff0c; U {A&#xff0c;B&#xff0c;C&#xff0c;D &#xff0c;E} &#xff0c; F {B→A &#xff0c;D→A &#xff0c;A→E &#xff0c;AC→B }&#xff0c;则 R 的候选关键字为&#xff08;CD&#xff09;&#xff…

76、docker-harbor

一、docker-harbor 私有仓库部署和管理&#xff1a; docker-harbor 私有仓库部署和管理&#xff1a; harbor&#xff1a;开源的企业级的docker仓库软件。 仓库&#xff1a;私有仓库、公有仓库。私有仓库。 docker-harbor&#xff1a;是有图形化的&#xff0c;页面UI展示的一…

1.XV6环境配置

安装虚拟机 这个就不多说了&#xff0c;搞一台Ubuntu虚拟机即可&#xff0c;最好是通过vscode 用ssh远程连接进行实验会比较方便&#xff0c;具体怎么做可参考我这篇博客&#xff1a; VsCode配置SSH连接远程服务器&#xff08;手把手&#xff0c;学不会打我&#xff09;_vsco…

【Hot100】LeetCode—148. 排序链表

目录 1- 思路归并 2- 实现⭐148. 排序链表——题解思路 3- ACM 实现 原题连接&#xff1a;148. 排序链表 1- 思路 归并 1- 先求解链表的长度&#xff0c;求出长度后利用 subLen 1 开始归并 定义虚拟头结点 dummyHead &#xff0c;便于处理头结点 2- 归并逻辑 for(int subLen…

nacos 使用 docker 单机部署连接 MySQL 数据库并开启鉴权

文章目录 本地部署的配置启用鉴权(未验证) docker部署的配置修改docker 镜像源启用鉴权&#xff0c;必须添加如下环境变量如何生成鉴权的密钥 完整环境变量docker启动命令 本地部署的配置 文件结构 application.properties #配置文件 mysql-schema.sql …