精华内容
下载资源
问答
  • 很早之前就想做个缓存框架,之前的redis缓存都是通过判断有没有缓存进而插入和更新,大量的重复代码,缓存利用率不高。真正自己设计的时候,发现在高一致模式下同步是个问题,高一致即数据库表与缓存保持一致。幸...

    C#基于阿里canal监听mysql binlog kafka模式

    前言

    没接触过java spring cloud之前对aop的概念很薄弱,基于c#的通常都是微软封装好的filter类,进而实现就好。很早之前就想做个缓存框架,之前的redis缓存都是通过判断有没有缓存进而插入和更新,大量的重复代码,缓存利用率不高。真正自己设计的时候,发现在高一致模式下同步是个问题,高一致即数据库表与缓存保持一致。幸好,发现了阿里开源的canal正好满足需求。正所谓技术大多数服务于业务场景,本文就是C#基于阿里canal监听mysql binlog kafka模式实现binlog的组件化。

    符合的业务场景有

    监听某张表进行监听,进行推送,如发现订单,推送到各个系统【微服务体系下,如果有订单中心就不存在这个事】

    redis缓存的高一致性模式,即数据库表与缓存保持一致

    进行监听

    在startup ConfigureServices中配置

    services.AddBinlog(options =>

    {

    options.SubTableList = new List() {

    "库名.表名"

    //"zcy-test"//监听的表名 库名由于多环境不一致需要配置..

    };

    //options.CanalDestination = _config.Get("CanalDestination");//问DBA 要 Canal名称

    //options.CanalHost = _config.Get("CanalHost");//问DBA

    //options.CanalPort = int.Parse(_config.Get("CanalPort"));//问DBA

    options.ServerIP = "VM_50_11_centos";//KAFKA服务器IP

    options.ServerPort = 9092;//KAFKA服务器端口

    options.GroupId = "YYYQTest";//同一应用的GroupId应该一致的,如果负载均衡时被同一消费则不会再消费了..

    });

    serviceProvider = services.BuildServiceProvider();

    await Task.Factory.StartNew(() =>

    {

    var binlogService = serviceProvider.GetService();

    binlogService.BinlogReceived += ReceivedMessageHandler;//监听事件

    binlogService.Start(new CancellationTokenSource().Token);//开启binlog监听任务

    }, TaskCreationOptions.LongRunning);//使用长时间运行Task

    监听处理

    public void ReceivedMessageHandler(object sender,BinlogReceivedEventArgs e)

    {

    //打印接收到的表行数据变更json,来处理相关业务,建议推送到自己业务向mq里处理削峰

    Console.WriteLine(e.BinlogReceivedMessageModel.RowJson);

    }

    kafka消费Code

    public void Start(CancellationToken cancellationToken)

    {

    if (string.IsNullOrEmpty(_binlogOptions.GroupId))

    {

    throw new Exception("GroupId不能为空!");

    }

    var config = new ConsumerConfig

    {

    BootstrapServers = _binlogOptions.ServerIP + ":" + _binlogOptions.ServerPort,

    GroupId = "Consumer" + _binlogOptions.GroupId,

    AutoOffsetReset = AutoOffsetReset.Latest,//这个模式一定要注意

    };

    using (var consumer = new ConsumerBuilder(config)

    .SetErrorHandler((_, e) => Console.WriteLine($"Kafka连接错误:Error: {e.Reason}"))

    .Build())

    {

    consumer.Subscribe(_binlogOptions.SubTableList);

    try

    {

    while (true)

    {

    try

    {

    var consumeResult = consumer.Consume(cancellationToken);

    KafkaDataModel kafkaDataModel = JsonConvert.DeserializeObject(consumeResult.Message.Value);

    if (kafkaDataModel.data==null)

    {

    continue;

    }

    BinlogReceivedMessageModel binlogReceivedMessageModel = new BinlogReceivedMessageModel();

    binlogReceivedMessageModel.DataBaseName = kafkaDataModel.database;

    binlogReceivedMessageModel.TableName = kafkaDataModel.table;

    binlogReceivedMessageModel.RowJson = kafkaDataModel.data[0].ToString();

    binlogReceivedMessageModel.Type = kafkaDataModel.type;

    BinlogReceived?.Invoke(this, new BinlogReceivedEventArgs(binlogReceivedMessageModel));//进行通知

    }

    catch (ConsumeException e)

    {

    Console.WriteLine($"Kafka消费Error:{e.Error.Reason}");

    }

    }

    }

    catch (OperationCanceledException e)

    {

    //出现错误就取消消费,否则可能会造成消息丢失

    Console.WriteLine("Kafka消费Error:" + e.StackTrace);

    consumer.Close();

    }

    }

    }

    开源地址

    展开全文
  • 很早之前就想做个缓存框架,之前的redis缓存都是通过判断有没有缓存进而插入和更新,大量的重复代码,缓存利用率不高。真正自己设计的时候,发现在高一致模式下同步是个问题,高一致即数据库表与缓存保持一致。幸...

    C#基于阿里canal监听mysql binlog kafka模式

    前言

    没接触过java spring cloud之前对aop的概念很薄弱,基于c#的通常都是微软封装好的filter类,进而实现就好。很早之前就想做个缓存框架,之前的redis缓存都是通过判断有没有缓存进而插入和更新,大量的重复代码,缓存利用率不高。真正自己设计的时候,发现在高一致模式下同步是个问题,高一致即数据库表与缓存保持一致。幸好,发现了阿里开源的canal正好满足需求。正所谓技术大多数服务于业务场景,本文就是C#基于阿里canal监听mysql binlog kafka模式实现binlog的组件化。

    符合的业务场景有

    监听某张表进行监听,进行推送,如发现订单,推送到各个系统【微服务体系下,如果有订单中心就不存在这个事】

    redis缓存的高一致性模式,即数据库表与缓存保持一致

    进行监听

    在startup ConfigureServices中配置

    services.AddBinlog(options =>

    {

    options.SubTableList = new List() {

    "库名.表名"

    //"zcy-test"//监听的表名 库名由于多环境不一致需要配置..

    };

    //options.CanalDestination = _config.Get("CanalDestination");//问DBA 要 Canal名称

    //options.CanalHost = _config.Get("CanalHost");//问DBA

    //options.CanalPort = int.Parse(_config.Get("CanalPort"));//问DBA

    options.ServerIP = "VM_50_11_centos";//KAFKA服务器IP

    options.ServerPort = 9092;//KAFKA服务器端口

    options.GroupId = "YYYQTest";//同一应用的GroupId应该一致的,如果负载均衡时被同一消费则不会再消费了..

    });

    serviceProvider = services.BuildServiceProvider();

    await Task.Factory.StartNew(() =>

    {

    var binlogService = serviceProvider.GetService();

    binlogService.BinlogReceived += ReceivedMessageHandler;//监听事件

    binlogService.Start(new CancellationTokenSource().Token);//开启binlog监听任务

    }, TaskCreationOptions.LongRunning);//使用长时间运行Task

    监听处理

    public void ReceivedMessageHandler(object sender,BinlogReceivedEventArgs e)

    {

    //打印接收到的表行数据变更json,来处理相关业务,建议推送到自己业务向mq里处理削峰

    Console.WriteLine(e.BinlogReceivedMessageModel.RowJson);

    }

    kafka消费Code

    public void Start(CancellationToken cancellationToken)

    {

    if (string.IsNullOrEmpty(_binlogOptions.GroupId))

    {

    throw new Exception("GroupId不能为空!");

    }

    var config = new ConsumerConfig

    {

    BootstrapServers = _binlogOptions.ServerIP + ":" + _binlogOptions.ServerPort,

    GroupId = "Consumer" + _binlogOptions.GroupId,

    AutoOffsetReset = AutoOffsetReset.Latest,//这个模式一定要注意

    };

    using (var consumer = new ConsumerBuilder(config)

    .SetErrorHandler((_, e) => Console.WriteLine($"Kafka连接错误:Error: {e.Reason}"))

    .Build())

    {

    consumer.Subscribe(_binlogOptions.SubTableList);

    try

    {

    while (true)

    {

    try

    {

    var consumeResult = consumer.Consume(cancellationToken);

    KafkaDataModel kafkaDataModel = JsonConvert.DeserializeObject(consumeResult.Message.Value);

    if (kafkaDataModel.data==null)

    {

    continue;

    }

    BinlogReceivedMessageModel binlogReceivedMessageModel = new BinlogReceivedMessageModel();

    binlogReceivedMessageModel.DataBaseName = kafkaDataModel.database;

    binlogReceivedMessageModel.TableName = kafkaDataModel.table;

    binlogReceivedMessageModel.RowJson = kafkaDataModel.data[0].ToString();

    binlogReceivedMessageModel.Type = kafkaDataModel.type;

    BinlogReceived?.Invoke(this, new BinlogReceivedEventArgs(binlogReceivedMessageModel));//进行通知

    }

    catch (ConsumeException e)

    {

    Console.WriteLine($"Kafka消费Error:{e.Error.Reason}");

    }

    }

    }

    catch (OperationCanceledException e)

    {

    //出现错误就取消消费,否则可能会造成消息丢失

    Console.WriteLine("Kafka消费Error:" + e.StackTrace);

    consumer.Close();

    }

    }

    }

    开源地址

    展开全文
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    学生提问:Java为什么要对这些数据进行缓存呢? 67 3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 ...
  • 本源码通过一个多线程下载器的完整编写示例,帮助Android移动开发新手了解如何获取已下载文件长度、如何得到原始文件长度,如何开启线程数,缓存各线程下载的长度,构建文件下载器,更新指定线程最后下载的位置,把...
  • Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、...
  • java范例开发大全

    2013-03-08 20:06:54
    实例278 通过指定的URL可以获取网页的源代码 542 实例279 一对多通信模式 544 实例280 自制浏览器 549 实例281 扫描TCP端口 551 实例282 TCP协议服务器 552 实例283 TCP协议客户机 553 实例284 Socket连接信息 555 ...
  • java核心技术第八版(1,2卷)源码

    千次下载 热门讨论 2009-04-04 21:04:35
     7.13.5 通过系统剪贴板传递Java对象  7.13.6 使用本地剪贴板来传递对象引用  7.14 拖放操作  7.14.1 Swing对数据传递的支持  7.14.2 拖曳源  7.14.3 放置目标  7.15 平台集成  7.15.1 闪屏  7.15.2 启动...
  • java范例开发大全源代码

    热门讨论 2011-10-30 23:31:51
    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...
  • 7.13.5 通过系统剪贴板传递Java对象 7.13.6 使用本地剪贴板来传递对象引用 7.14 拖放操作 7.14.1 Swing对数据传递的支持 7.14.2 拖曳源 7.14.3 放置目标 7.15 平台集成 7.15.1 闪屏 7.15.2 启动桌面应用程序 7.15.3 ...
  • Java范例开发大全 (源程序)

    热门讨论 2011-04-27 07:47:22
    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7...
  • 精通Java Web整合开发(JSP+AJAX+Struts+Hibernate)(第2版)

    千次下载 热门讨论 2012-11-29 14:55:20
    2.3.1 通过server.xml配置tomcat8 2.3.2 web应用的目录结构9 2.3.3 web.xml配置详解10 2.3.4 如何修改tomcat的默认端口11 2.3.5 如何配置虚拟主机11 2.3.6 如何部署web应用12 2.4 安装数据库服务器mysql 5.512 2.5 ...
  • java范例开发大全(pdf&源码)

    热门讨论 2013-07-04 13:04:40
    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...
  • Java范例开发大全(全书源程序)

    热门讨论 2013-04-05 11:50:26
    Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...
  • 第二部分详细讲解了Struts 2.1、Spring 2.5和Hibernate 3.2三个框架用法,介绍三个框架时,通过Eclipse IDE的使用来上手,一步步带领读者深入三个框架的核心。这部分内容是笔者讲授“疯狂Java实训”的培训讲义,既...
  • Java基础、JavaWeb基础到常用的框架再到面试题都有完整的教程,几乎涵盖了Java后端必备的知识点。该开源仓库的文章都是我个人原创,公众号发过的技术文章(干货)也会有相关的目录整理,很多知识点我还在不停的...
  • 于是自然想到App巨头“微信”会是怎么处理,Luban(鲁班)就是通过在微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法。 因为有其他语言也想要实现Luban,所以描述了一遍...
  • Java源码,Android源码,多线程,断点下载 android多线程断点下载,通过本Android下载实例,可了解到以下知识技巧:实时得到文件下载的长度,设置获取实体数据的范围、获取文件已下载文件长度、原始文件长度、线程数、...
  • memcached1

    2013-03-30 21:42:09
    通常我们是把memcached安装运行在web服务器上,然后通过对需要的数据进行缓存,据我目前所知,所有数据的缓存设置和存取操作,以及数据的更新后替换操作全部需要程序来进行,而不是自动进行的(自动不知道能不能成功...
  • |--应用启动之检查版本更新及初始化 |--延时任务的工具类 |--异常之UncaughtExceptionHandler全局捕获处理 |--异步任务AsyncTask的用法 |--异步任务的自定义 |--快捷方式增删查 |--手势识别器GestureDetector的用法 ...
  • 包含各种工具类的集合,会不定期更新,欢迎贡献code 使用方法: 2.0.0以后,放弃了support库,请使用AndroidX implementation 'com.easyandroid:easytools:2.0.3' 然后,在自己的Application中调用Utils.init(this)...
  • 3. 更新数据(源代码:hibernate_0300) 207 4. 加载数据(源代码:hibernate_0400) 208 5. 缓存 211 6. 对象映射配置 212 7. 元素介绍 212 8. 元素介绍 212 9. 元素介绍 213 10. 元素介绍 214 (七) ID的生成策略 ...
  • 《JUnit5学习》系列旨在通过实战提升SpringBoot环境下的单元测试技能,一共八篇文章,链接如下: 《JUnit5学习之一:基本操作》 《JUnit5学习之二:Assumptions类》 《JUnit5学习之三:Assertions类》 《JUnit5学习...
  • 图片加载picasso,Glide加载监听,获取缓存,圆角图片,高斯模糊 list条目点击水波纹效果 CoordinatorLayout+Behavior实现标题栏渐变 自定义RecyclerView下拉刷新上拉加载,支持加载loading,空页面,异常界面,有...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
热门标签
关键字:

java通过监听更新缓存

java 订阅