elasticsearch——数据同步

这篇具有很好参考价值的文章主要介绍了elasticsearch——数据同步。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

数据同步思路分析

方案一:同步调用

方案二:异步通知

方案三:监听binlog 

区别

关于elasticsearch与数据库数据同步

导入课前资料提供的hotel-admin项目,启动并测试酒店数据的CRUD

声明exchange、queue、RoutingKey

导依赖

加配置

定义静态类

在hotel-admin中的增、删、改业务中完成消息发送

在hotel-demo中完成消息监听,并更新elasticsearch中数据


数据同步思路分析

elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的数据同步。

在微服务中,负责酒店管理(操作mysql )的业务与负责酒店搜索(操作elasticsearch )的业务可能在两个不同的微服务上,数据同步该如何实现呢?

方案一:同步调用

elasticsearch数据同步,elasticsearch,java,大数据

方案二:异步通知

elasticsearch数据同步,elasticsearch,java,大数据

方案三:监听binlog 

elasticsearch数据同步,elasticsearch,java,大数据

区别

方式一:同步调用

         优点:实现简单,粗暴

         缺点:业务耦合度高

方式二:异步通知

         优点:低耦合,实现难度一般

         缺点:依赖mq的可靠性

方式三:监听binlog

优点:完全解除服务间耦合

缺点:开启binlog增加数据库负担、实现复杂度高 

关于elasticsearch与数据库数据同步

导入课前资料提供的hotel-admin项目,启动并测试酒店数据的CRUD

声明exchange、queue、RoutingKey

一般是在消费者服务声明这些东西,也就是hotel-dome服务,hotel-admin服务时消息发送者

导依赖

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

加配置

  rabbitmq:
    port: 5672
    host: 8.130.89.67
    virtual-host: /
    username: itcast
    password: 123
  #    listener:
  #      simple:
  #        prefetch: 1

定义静态类

package cn.itcast.hotel.constants;

public class MyContantsMq {
    /**
     * 交换机
     */
    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";
}

在hotel-admin中的增、删、改业务中完成消息发送

也就是消息生产者的配置

还是导依赖和添加配置

添加静态类

然后找到controller层的mysql操作代码

需要先声明 RabbitTemplate这个bean,通过自动注入

    @PostMapping
    public void saveHotel(@RequestBody Hotel hotel){
        rabbitTemplate.convertAndSend(MyContantsMq.HOTEL_EXCHANGE,MyContantsMq.HOTEL_INSERT_KEY,hotel.getId());
        hotelService.save(hotel);
    }

    @PutMapping()
    public void updateById(@RequestBody Hotel hotel){
        if (hotel.getId() == null) {
            throw new InvalidParameterException("id不能为空");
        }
        rabbitTemplate.convertAndSend(MyContantsMq.HOTEL_EXCHANGE,MyContantsMq.HOTEL_INSERT_KEY,hotel.getId());
        hotelService.updateById(hotel);
    }

    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable("id") Long id) {
        rabbitTemplate.convertAndSend(MyContantsMq.HOTEL_EXCHANGE,MyContantsMq.HOTEL_DELETE_KEY,id);
        hotelService.removeById(id);
    }

在hotel-demo中完成消息监听,并更新elasticsearch中数据

@Configuration
public class MqListener {
    @Autowired
    private IHotelService service;
    /**
     * Topic
     * 新增和修改监听
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = MyContantsMq.HOTEL_INSERT_QUEUE),
            exchange = @Exchange(name = MyContantsMq.HOTEL_EXCHANGE,type = ExchangeTypes.TOPIC),
            key = {MyContantsMq.HOTEL_INSERT_KEY}
    ))
    public void listenTopicInsertQueue(Long id){
        service.insert(id);
    }
    /**
     * Topic
     * 删除监听
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = MyContantsMq.HOTEL_DELETE_QUEUE),
            exchange = @Exchange(name = MyContantsMq.HOTEL_EXCHANGE,type = ExchangeTypes.TOPIC),
            key = {MyContantsMq.HOTEL_DELETE_KEY}
    ))
    public void listenTopicDeleteQueue(Long id){
        service.delete(id);
    }
}

这是监听类,现在就去service层写代码

    @Override
    public void delete(Long id) {
        DeleteRequest request=new DeleteRequest("hotel",id.toString());
        try {
            restHighLevelClient.delete(request,RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void insert(Long id) {
        Hotel hotel = getById(id);
        HotelDoc hotelDoc=new HotelDoc(hotel);
        IndexRequest request=new IndexRequest("hotel").id(id.toString());
        request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
        try {
            restHighLevelClient.index(request,RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

可以把之前的测试类代码拿来改改就行文章来源地址https://www.toymoban.com/news/detail-780209.html

到了这里,关于elasticsearch——数据同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch --- 数据同步、集群

    elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的 数据同步 。   思路分析: 常见的数据同步方案有三种: 同步调用 异步通知 监听binlog   方案一:同步调用 基本步骤如下: hotel-demo对外提供接

    2024年02月03日
    浏览(32)
  • SpringCloud:ElasticSearch之数据同步

    elasticsearch 中的酒店数据来自于 mysql 数据库,因此 mysql 数据发生改变时, elasticsearch 也必须跟着改变,这个就是 elasticsearch 与 mysql 之间的 数据同步 。 常见的数据同步方案有三种: 同步调用 异步通知 监听 binlog 1.1.同步调用 方案一:同步调用 基本步骤如下: hotel-demo 对外提

    2024年02月04日
    浏览(27)
  • elasticsearch数据同步到hive

    来自用户的需求: 用户有一部分数据来自 elasticsearch ,我们已经支持了通过 presto 查询 es 数据。但是用户需要将 es 表 和 hive 表做关联查询,而 presto 是不能跨数据源进行 join 查询的。所以需要先把 es 数据导入到 hive 中 用户对数据同步周期的要求并不高 一天1-2次就可以了,所

    2024年02月09日
    浏览(27)
  • elasticsearch与mysql数据同步

    elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的 数据同步 。 常见的数据同步方案有三种: 同步调用 异步通知 监听binlog 1.同步调用 方案一:同步调用 基本步骤如下: hotel-demo对外提供接口,用

    2024年02月01日
    浏览(40)
  • elasticsearch实现mysql数据同步

    当酒店数据发生增、删、改时,要求对elasticsearch中数据也要完成相同操作。 常见的数据同步方案有三种: 同步调用 异步通知 监听binlog 以下使用异步通知同步elasticsearch的数据  constatnts 包下新建一个类 MqConstants,存储交换机和队列的名称 发送MQ消息   在增、删、改业务中分

    2024年02月09日
    浏览(25)
  • 4种数据同步到Elasticsearch方案

    上周听到公司同事分享 MySQL 同步数据到 ES 的方案,发现很有意思,感觉有必要将这块知识点再总结提炼一下,就有了这篇文章。 本文会先讲述数据同步的 4 种方案,并给出常用数据迁移工具 ,干货满满! 不 BB,上文章目录: 在实际项目开发中,我们经常将 MySQL 作为业务数

    2024年02月07日
    浏览(27)
  • elasticsearch 实现与mysql 数据同步

    mysql8相关的安装可以看下另一篇博客 https://editor.csdn.net/md/?articleId=135905811 1.下载安装logstash 2.logstash 配置 logstash.yml 3.pipelines.yml 配置 同步方式: 1.logstash 2.go-mysql-elasticsearch 3.canal(阿里云) 一.logstash 1.安装mysql-connector-java 插件(需与mysql 版本一致) 2.配置logstash.conf 3.启动logsta

    2024年04月12日
    浏览(29)
  • ElasticSearch集成SpringBoot实践及数据同步

    ES 全称 Elasticsearch 是一款分布式的全文搜索引擎,在互联网公司中,这款搜索引擎一直被程序员们所推崇。常见的使用场景如ELK日志分析,电商APP的商品推荐,社交APP的同城用户推荐等等。今天结合自己平时的一些学习对它与SpringBoot的基础集成以及一些实际项目中的使用做

    2024年02月07日
    浏览(40)
  • Logstash同步MySQL数据到ElasticSearch

    当MySQL数据到一定的数量级,而且索引不能实现时,查询就会变得非常缓慢,所以使用ElasticSearch来查询数据。本篇博客介绍使用Logstash同步MySQL数据到ElasticSearch,再进行查询。 测试环境 Windows系统 MySQL 5.7 Logstash 7.0.1 ElasticSearch 7.0.1 Kibana 7.0.1 ELK工具下载可访问:https://www.elastic

    2024年02月01日
    浏览(34)
  • 微服务学习|elasticsearch:数据聚合、自动补全、数据同步

    聚合 (aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 度量(Metric)聚合:用以计算一些值,比如: 最大值、最小值、平均

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包