Elasticsearch和MySQL之间的数据同步问题

news2024/9/24 21:28:44

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章参考网上的课程,介绍Elasticsearch和MySQL之间的数据同步问题。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

在这里插入图片描述

以下正文开始

文章目录

在这里插入图片描述

Elasticsearch中的数据是来自于Mysql数据库的,因此当数据库中的数据进行增删改后,Elasticsearch中的数据,索引也必须跟着做出改变。而对于管理服务(MySQL)和搜索服务(Elasticsearch)往往会在不同的微服务上。

可以通过微服务之间的同步调用来解决数据同步问题,虽然实现起来比较简单,但是在搜索服务中引入管理服务时,业务的耦合度相对来说是比较高的。因此可以通过消息队列的形式来异步通知管理服务的改变。这样做的有优点是耦合度较低,但是依赖于消息队列的耦合度。

下面根据一个例子来介绍使用RabbitMQ来解决Elasticsearch和MySQL之间的数据同步问题。当酒店数据库中发送增删改时,Elasticsearch中的数据也同时发生对应的改变。

首先在两块微服务中引入RabbitMQ的依赖:
引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

创建常量类,将交换机和队列名称设置为常量,使用时方便取名。

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";
    /**
     * 新增或修改的路由键
     */
    public final static String HOTEL_INSERT_KEY = "hotel.insert";
    /**
     * 删除的路由键
     */
    public final static String HOTEL_DELETE_KEY = "hotel.delete";
}

创建配置类,声明交换机,并将路由键,队列与交换机之间互相绑定:

@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);
    }
}

编写controller层,将酒店数据保存到数据库中,并将消息发送到消息队列里:

    @Autowired
    private IHotelService hotelService;
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @PutMapping
    public void save(@RequestBody Hotel hotel){
        hotelService.save(hotel);
        rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE,MqConstants.HOTEL_INSERT_KEY,hotel.getId());
    }
    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable("id") Long id){
        hotelService.removeById(id);
        rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE,MqConstants.HOTEL_DELETE_KEY,id);
    }

在service中加入两个方法,根据id增加和根据id删除:

    void insertById(Long id);
    void deleteById(Long id);

利用Ctrl+Alt+B的快捷键,在service的实现类里面重写方法进行实现:

    @Override
    public void insertById(Long id) {
        try {
            Hotel hotel = getById(id);
            HotelDoc hotelDoc = new HotelDoc(hotel);
            // 1.准备Request
            IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
            // 2.准备请求参数DSL,其实就是文档的JSON字符串
            request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
            // 3.发送请求
            client.index(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void deleteById(Long id) {
        try {
            DeleteRequest request = new DeleteRequest("hotel", id.toString());
            // 2.发送请求
            client.delete(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

这样即可完成Elasticsearch和MySQL之间的数据同步。

图书推荐
在比尔 · 盖茨的众多称谓中,据说他更偏爱“首席软件架构师”。在网易创始人丁磊名字前,也有“首席架构师”这样的称谓。架构师是如此重要,以至于在《黑客帝国》 中各色人物悉数登场,最后你却发现这一切都是被一个称作“架构师”的白胡子老头左 右的。

这是否意味着要成为架构师就要以“领导”权威来支撑或者以时间或实践来积累? 当然不必这样,在修炼成“架构师”的道路上,一本好书能让你少走许多弯路,帮助你学会“架构师”思维,快速进入“架构师”角色。

随着数字时代的到来,各种云基础设施、微服务、框架层出不穷,互联和互操作变 得唾手可得,集成和重用已有成果成为软件开发常态。在软件系统变得越来越复杂的同时,今天架构师似乎不再需要架构知识了,甚至软件开发的精髓被调侃是“ Ctrl+C 和 Ctr1+V ”。显然,在已有的架构上实现二次架构设计并不是架构师的未来,我们既要站 在巨人的肩膀上, 善于利用后发优势, 更需要从原始创新上取得突破, 这就需要你回到 问题的原点,系统地掌握软件架构的知识,努力贡献优秀的原创架构。

《软件架构实践》就是这样一本书。本书是其第 4 版,在软件架构领域,本书已经成为标准软件架构的术语或知识,大都可以在这本书中找到相关内容和最准确的定义。

图片

本书共分为六个部分。

第一部分对软件架构进行了定义,并从13个方面揭示软件架构的重要性,希望这13个方面能激起你学习软件架构的兴趣。

第二部分是关于质量属性的,你如果还分不清“可用性”(availability)和“易用性”(Usability)的差别,或觉得“安全性”(safety)和“防护性”(security)就是一回事,那么应该仔细看看这一部分。这部分对10个颇具代表性的质量属性进行了全面介绍,给出了一种通用形式来描述质量属性,介绍了每个质量属性要关注的问题并给出了现成的“解决方案”,你甚至可以直接把这些 知识运用到你当前的设计中去。

第三部分具有很强的时代感,紧密结合当前最流行的技术,包括虚拟化、云计算和移动技术,介绍了当下架构解决方案要关注的内容

第四部分可扩展架构实践,为设计架构、架构评估和记录架构等活动提供了可操作的工程方法,旨在为完成这些复杂的架构活动提供指南,帮助普通人学习并熟练地完成架构相关工作。如果面对复杂设计你还不知从何下手,则完全可以按照书中介绍的工程方法和交付样式“照猫画虎”,相信通过亲自实践你会掌握书中方法的精髓。

第五部分全面介绍了架构师在组织中的角色和应具备的能力,架构师不能活在象牙塔里,这部分知识可以让你根据个人的情况和组织的发展要求,找到自己的努力方向,理解相关处境,做出正确 选择。最后一部分介绍了最新的量子计算,并思考了其可能对架构的影响,也算是为读 者留下一些悬念。

图片

本书可以作为架构师的工具书,你不必从头开始,根据遇到的问题,找到相应章节就可以得到参考架构解决方案你也可以把它当作工程行动指南,面对复杂问题,按照其中介绍的方法采取相应行动即可。本书将理论和实践紧密结合,如果你的组织很重视 架构,但常常出现曲高和寡和不落地现象,时间比较充裕的话,可以好好阅读一下本书哦。

京东购买链接:点击了解

评论区任意留言可参与活动抽奖(评论最多五条,抽取四名欧皇)

好了,本篇文章就先分享到这里了,后续会继续分享其他方面的知识,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

vue路由接口转发

目录 一、nginx的路由转发 二、vue路由转发 三、两者路由转发的区别 vue的路由和nginx的路由有许多相似之处&#xff0c;也有一些不同的地方。 两者都有接口转发的功能&#xff0c;但是具体转发的方式会有一些区别。 一、nginx的路由转发 nginx的路由是这样的&#xff1a;…

C# Modbus通信从入门到精通(3)——Modbus RTU(0x01功能码)

1、01(0x01)读线圈 使用该功能码能从远程地址中读取1到2000个线圈的状态,每个线圈的状态只能是0或者1,读取的线圈数据由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+线圈数量高位+线圈数量低位+CRC,一共8个字节,其…

JS-变量

文章目录 1.变量概述1.1 什么是变量1.2 变量在内存中的存储 2.变量的使用2.1 声明变量2.2 赋值2.3 变量的初始化 3.变量语法扩展3.1 更新变量3.2 同时声明多个变量3.3 声明变量特殊情况 4.变量命名规范 1.变量概述 1.1 什么是变量 变量是用于存放数据的容器。 我们通过 变量名…

gulimall-性能监控-压力测试

性能监控与压力测试 前言一、性能监控1.1 jvm 内存模型1.2 jvisualvm 作用1.3 监控指标 二、压力测试2.1 概念2.2 性能指标2.3 JMeter 压测工具 前言 本文继续记录B站谷粒商城项目视频 P141-150 的内容&#xff0c;做到知识点的梳理和总结的作用。 一、性能监控 1.1 jvm 内存…

AcWing 106. 动态中位数—对顶堆

问题链接 AcWing 106. 动态中位数 问题描述 分析 推荐b站董晓算法视频讲解对顶堆 这道题应该用树状数组、平衡树也能解决&#xff0c;这里用对顶堆来做&#xff0c;对顶堆能够用维护第K位置的数&#xff0c;K是固定的&#xff0c;在这道题中&#xff0c;维护两个堆&#xff…

posix ipc之匿名信号量

note 使用信号量进行进程间通信时&#xff0c;信号量要放置在共享内存上&#xff1b;若是线程间通信&#xff0c;放堆上或全局变量区就行 code // 使用信号量进行进程间通信时&#xff0c;信号量要放置在共享内存上&#xff1b;若是线程间通信&#xff0c;放堆上或全局变量区…

Python批量实现Word、EXCLE、PPT转PDF文件

一、绪论背景 在日常办公和文档处理中&#xff0c;有时我们需要将多个Word文档、Excel表格或PPT演示文稿转换为PDF文件。将文档转换为PDF格式的好处是它可以保留文档的布局和格式&#xff0c;并且可以在不同平台上进行方便的查看和共享。 本篇博文将介绍如何使用Python编程语言…

0714两小时配置完服务器环境

之前那个222的服务器&#xff0c;不知道下载的什么东西&#xff0c;包含了一个挖矿程序&#xff0c;然后就停掉了它。 重新配置一个环境在220服务器上。 1、配置anaconda :(直接下载的这个博客的那个版本&#xff09; https://blog.csdn.net/m0_46926492/article/details/1293…

【分布式】ceph存储

目录 一、存储基础单机存储设备单机存储的问题商业存储解决方案 二、 分布式存储 &#xff08;软件定义的存储 SDS&#xff09;分布式存储的类型Ceph 优势Ceph 架构Ceph 核心组件Pool中数据保存方式支持两种类型&#xff1a;Pool、PG 和 OSD 的关系OSD 存储后端BlueStore 的主要…

本地生活直播,和电商直播有什么不一样?

直播正在成为零售业的标配&#xff0c;当下最新的一条赛道是“本地生活直播”。 &#xff08;商家开始在美团等平台进行本地生活直播。摄影&#xff1a;李崧稷&#xff09; 今年618&#xff0c;在老牌电商平台拉着无数网店&#xff0c;拼尽全力想要堆高销量的时候&#xff0c;一…

k8s之Pod详解

目录 一、Pod基础概念1.1 在Kubrenetes集群中Pod有如下两种使用方式1.2 kubernetes中的pause容器主要为每个容器提供以下功能1.3 Kubernetes设计这样的Pod概念和特殊组成结构有什么用意&#xff1f; 二、Pod分类三、容器的分类3.1 pause基础容器&#xff08;infrastructure con…

[SCTF2019]creakme

前言 主要是SEH解密然后AES加密 分析 SEH main函数中获取到程序句柄也就是首地址&#xff0c;然后进入图中函数找到.SCTF段地址后产生异常&#xff0c;在异常中进行代码自解密 装载的SEH异常处理函数 因为在异常中有调试判断&#xff0c;所以处于调试状态中将异常抛给调试者…

玩转内存修改函数——【C语言】

在上篇博客中&#xff0c;我们学习了字符串函数&#xff0c;针对一些字符串我们可以做出一系列操作。接下来我们将学习一些内存修改函数&#xff08;#inlcude<string.h>&#xff09;&#xff0c;让我们一起走进mempy、memmove、memcmp函数中。 目录 mempcy函数​编辑 m…

leetcode刷题(轮转数组、买股票的最佳时机、买卖股票的最佳时机2、跳跃游戏、跳跃游戏2、最大子序列交替和、交替数字和、下降路径最小和)

目录 1、轮转数组 2、买卖股票的最佳时机 3、买卖股票的最佳时机② 4、跳跃游戏 5、跳跃游戏2 6、最大子序列交替和 7、交替数字和 8、下降路径最小和 1、轮转数组 class Solution():def rotate(self, nums, k):def reverse(i, j): #逆置数组while i < j:nums[i]…

Oracle Apex制作一个简单的交互式报表页面&页设计

目录 创建好一个菜单表 简单查询一下&#xff1a; 创建交互式报表 工作报表展示​编辑 菜单报表展示​编辑 页设计器 改变布局样式 修改标签内容 添加验证&#xff06;更改必填项 注意&#xff01; 在主页进行跳转 页跳转按钮 主页可以跳转到指定报表 面包屑 报表也可…

Clickhouse数据一致性和物化视图

Clickhouse 一、数据一致性的保证1.通过Group by对数据去重2.通过 FINAL 查询 二、物化视图1.物化视图与普通视图的区别2.优缺点3.基本语法 三、MaterializeMySQL引擎1.特点2.使用细则 四、常见问题排除分布式 DDL某数据节点的副本不执行数据副本表和数据不一致副本节点全量恢复…

【uniapp开发小程序】设置全屏的开屏广告、长按识别图片、点击跳转通话 拨打电话

设置全屏的开屏广告需求实现 效果图&#xff1a; 点击跳转其他小程序&#xff1a; uni.navigateToMiniProgram() 官方文档&#xff1a;uni.navigateToMiniProgram(OBJECT) | uni-app官网 // 示例代码 uni.navigateToMiniProgram({appId: ,path: pages/index/index?id123,ext…

Cilium核心技术-eBPF XDPTC介绍

eBPF 是一项革命性技术&#xff0c;它能在内核中运行沙箱程序&#xff08;sandbox programs&#xff09;&#xff0c; 而无需修改内核源码或者加载内核模块。 eBPF的一个重要特性是能够使用高级语言(如C)来实现程序。LLVM有一个eBPF后端&#xff0c;用于编辑包含eBPF指令的ELF文…

WEB:Web_php_unserialize

背景知识 反序列化函数及绕过 正则表达式及绕过 题目 源码解析&#xff08;参考链接在最后&#xff09; <?php class Demo { //定义一个类private $file index.php; //变量属性public function __construct($file) { //类方法$this->file $file; …

分布式锁与同步锁

什么是分布式锁 分布式锁是一种在分布式系统中用于协调多个节点访问共享资源的机制。在分布式系统中&#xff0c;由于存在多个节点并行执行任务&#xff0c;可能会出现竞争条件和数据不一致的问题。分布式锁通过约束同一时刻只有一个节点能够获得锁的方式&#xff0c;确保了对…