博客
关于我
ElasticSearch - 在 微服务项目 中基于 RabbitMQ 实现 ES 和 MySQL 数据异步同步(考点)
阅读量:789 次
发布时间:2023-01-24

本文共 1999 字,大约阅读时间需要 6 分钟。

数据库与Elasticsearch数据同步解决方案

微服务架构带来了分布式系统的优势,但也对数据同步提出了一系列挑战。不同服务可能共享相同的数据,因此需要一种高效且可靠的方式来保证数据的一致性。本文将探讨几种常见的数据同步解决方案,并分析它们的优缺点。

同步调用:简单但存在问题

同步调用是一种直接的方法,但不可忽视它的潜在问题。操作流程大致如下:

  • 用户在酒店管理服务中执行增删改操作。
  • 数据库更新完成后,调用酒店搜索服务的接口。
  • Elasticsearch 数据更新。
  • 搜索服务返回反馈。
  • 这种方法的缺陷包括:

  • 数据耦合:额外的代码逻辑增加了复杂性,无需此功能的服务耦合在一起。
  • 性能下降:增加了耗时,影响整体系统性能。
  • 潜在崩溃:任何一个步骤的异常都会导致业务失败。
  • 因此,这种方法并不理想,需要寻找更优化的解决方案。


    异步通知:使用消息队列

    异步通知方案利用消息队列(如 RabbitMQ)实现数据的高效传递。具体步骤如下:

  • 数据库记录新建、修改或删除操作。
  • 自动发布消息到消息队列。
  • 其他服务在需要时消费消息,执行相应操作。
  • 这种方法的优势明显:

    • 降低耦合度:服务之间仅通过事件传递合作,无需直接调用外部接口。
    • 提高性能:减少了等待外部响应的时间,提升整体效率。
    • 增强可靠性:消息可被重复发送,确保数据同步的可靠性。

    实现步骤如下:

  • 配置消息队列:创建交换机和队列,指定相应的路由键。
  • 监听消息:在目标服务中监听特定的队列,执行数据同步操作。
  • 发布消息:在执行数据库操作后,发布消息到消息队列。
  • 通过这种方法,代码耦合度降低,系统架构更加清晰,性能也得到了显著提升。


    监听数据库双写日志

    另一种数据同步方法是利用数据库的双写日志功能。这种方法不依赖消息队列,但会增加数据库的负担。具体流程如下:

  • 启用数据库的双写日志功能。
  • 采用中间件(如 Canal)监听双写日志。
  • 中间件实时处理日志,触发 Elasticsearch 的数据同步操作。
  • 这种方法的优点是耦合度最低,不依赖外部消息队列,但也需额外的资源投入和对数据库的调整。这取决于项目的具体需求和技术栈。


    基于 RabbitMQ 的具体实现方案

    结合以上思路,以下是基于 RabbitMQ 的异步通知方案的实现细节:

    1. 需求分析

    在酒店管理服务和酒店搜索服务之间,用户操作酒店管理服务时,需确保 Elasticsearch 中的数据保持一致。现有服务之间无法直接访问对方数据库,因此需要通过消息队列实现数据同步。

    2.监听队列并处理消息

    创建一个监听队列,注入 Spring 容器,通过 @RabbitListener声明监听逻辑。

    @Componentpublic class MqListener {    @Autowired    private IHotelService hotelService;    @RabbitListener(queues = MqConstants.DELETE_QUEUE)    public void HotelDeleteListener(Long id) {        hotelService.deleteHotelById(id);    }}

    3. 发布消息

    在酒店管理服务中,每次增删改操作后,发布消息到 RabbitMQ 中。

    @PostMapping("/save")public void saveHotel(@RequestBody Hotel hotel) {    hotelService.save(hotel);    rabbitTemplate.convertAndSend(MqConstants.EXCHANGE_TOPIC, MqConstants.DELETE_KEY, hotel.getId());}@PutMapping("/update")public void updateHotel(@RequestBody Hotel hotel) {    hotelService.updateById(hotel);    rabbitTemplate.convertAndSend(MqConstants.EXCHANGE_TOPIC, MqConstants.DELETE_KEY, hotel.getId());}

    4. 启动服务并测试

    通过配置化简,确保各服务能够正常运行并正确接收消息。测试中,确保数据库数据的动态变化能够被成功同步到 Elasticsearch 中。


    结论

    通过以上方法,可以有效解决数据库与 Elasticsearch 的数据同步问题。选择其中一种方案需综合考虑项目需求和技术优势。基于 RabbitMQ 的异步通知方案是一个优化且可靠的解决方案,既提升性能,又降低耦合度,适合微服务架构下的数据同步场景。

    转载地址:http://qheyk.baihongyu.com/

    你可能感兴趣的文章
    解决:angularjs radio默认选中失效问题
    查看>>
    Hadoop学习笔记—Yarn
    查看>>
    Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
    查看>>
    wxWidgets源码分析(3) - 消息映射表
    查看>>
    wxWidgets源码分析(9) - wxString
    查看>>
    [源码解析] 消息队列 Kombu 之 基本架构
    查看>>
    [源码分析] 消息队列 Kombu 之 启动过程
    查看>>
    wx.NET CLI wrapper for wxWidgets
    查看>>
    Silverlight for linux 和 DLR(Dynamic Language Runtime)
    查看>>
    Powershell中禁止执行脚本解决办法
    查看>>
    OO_Unit2 多线程电梯总结
    查看>>
    python 加密算法及其相关模块的学习(hashlib,RSA,random,string,math)
    查看>>
    JavaSE总结
    查看>>
    Python IO编程
    查看>>
    使用 TortoiseGit 时,报 Access denied 错误
    查看>>
    基于 HTML5 WebGL 的污水处理厂泵站自控系统
    查看>>
    c++之程序流程控制
    查看>>
    李笑来必读书籍整理
    查看>>
    Hadoop(十六)之使用Combiner优化MapReduce
    查看>>
    《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
    查看>>