此框架是SQL Server增量订阅,用来监听增删改数据库数据变更

目前仅支持SQL Server,Nuget上可以下载安装

或者使用Nuget命令添加包

dotnet add package Kogel.Subscribe.Mssql --version 0.0.0.1

(一)定义需要监听表的实体类

 /// <summary>
///
/// </summary>
[Display(Rename = "t_oms_order_detail")]
[ElasticsearchType(RelationName = "t_oms_order_detail", IdProperty = "Id")]
public class OmsOrderDetail : IBaseEntity<OmsOrderDetail, int>
{
/// <summary>
///
/// </summary>
[Identity]
[Display(Rename = "id")]
[Nest.PropertyName("id")]
public override int Id { get; set; } /// <summary>
///
/// </summary>
[Display(Rename = "name")]
[Nest.PropertyName("name")]
public string Name { get; set; } /// <summary>
///
/// </summary>
[Display(Rename = "trade_id")]
[Nest.PropertyName("trade_id")]
public int? TradeId { get; set; } /// <summary>
///
/// </summary>
[Display(Rename = "descption")]
[Nest.PropertyName("descption")]
public string Descption { get; set; } /// <summary>
///
/// </summary>
[Display(Rename = "create_time")]
[Nest.PropertyName("create_time")]
public DateTime CreateTime { get; set; }
}

[Display]和[Identity]属于Kogel.Dapper.Extension的特性如果[想了解更多请点击],[ElasticsearchType]和[Nest.PropertyName]属于Elasticsearch特性,如果没用到可以忽略

(二)定义表订阅

    /// <summary>
/// 定义表订阅
/// </summary>
public class OmsOrderDetailSubscribe : Subscribe<OmsOrderDetail>
{
/// <summary>
/// 设置连接配置
/// </summary>
/// <param name="builder"></param>
public override void OnConfiguring(OptionsBuilder<OmsOrderDetail> builder)
{
//此连接字符串账号需要有管理员权限
builder.BuildConnection("数据库连接字符串");
}
}

如果需要此表对应多张分表可以设置

//配置所有表分片
builder.BuildShards(new List<string>
{
"t_oms_order_detail_1",
"t_oms_order_detail_2",
"t_oms_order_detail_3"
})

(1).如果想推送订阅到RabbitMQ中

builder.BuilderRabbitMQ(new RabbitMQ.Client.ConnectionFactory
{
HostName = "localhost",
UserName = "guest",
Password = "guest"
})

可以通过BuildTopic设置交换机名称

builder.BuildTopic("kogel_subscribe_order_detail")

(2).如果想推送订阅到Kafka中

builder.BuildKafka(new ProducerConfig
{
BootstrapServers = "localhost:9092",
Acks = Acks.None
})

可以通过BuildTopic设置Topic名称

builder.BuildTopic("kogel_subscribe_order_detail")

(3).如果想推送订阅到Elasticsearch中

 builder.BuildElasticsearch(new ElasticsearchConfig<OmsOrderDetail>
{
Settings = new Nest.ConnectionSettings(new Uri("http://localhost:9200/")),
})

如果有设置Basic授权

builder.BuildElasticsearch(new ElasticsearchConfig<OmsOrderDetail>
{
Settings = new Nest.ConnectionSettings(new Uri("http://localhost:9200/"))
.BasicAuthentication("账号","密码")
})

如果想根据自己定义的分片逻辑插入到多个ES索引中可以通过WriteInterceptor

/// <summary>
/// 设置连接配置
/// </summary>
/// <param name="builder"></param>
public override void OnConfiguring(OptionsBuilder<OmsOrderDetail> builder)
{
//此连接字符串账号需要有管理员权限
builder.BuildConnection("数据库连接字符串");
//定义推送ES
builder.BuildElasticsearch(new ElasticsearchConfig<OmsOrderDetail>
{
Settings = new Nest.ConnectionSettings(new Uri("http://localhost:9200/"))
.BasicAuthentication("账号", "密码"),
WriteInterceptor = message => WriteInterceptor(message)
});
} /// <summary>
/// 定义自己的索引逻辑
/// </summary>
/// <param name="messages"></param>
/// <returns></returns>
private EsSubscribeMessage<OmsOrderDetail> WriteInterceptor(SubscribeMessage<OmsOrderDetail> message)
{
string esIndexName;
//这里写自己索引分片的业务逻辑
if (message.Result.Id % 3 == 0)
{
esIndexName = $"kogel_orders_2";
}
else
{
esIndexName = $"kogel_orders_1";
}
return message.ToEsSubscribeMessage(esIndexName);
}

并且ES索引不存在的时候会动态创建

(4).如果想自定义实现订阅逻辑,在可以Subscribe订阅类中重写

/// <summary>
/// 订阅变更 (每一次sql的执行会触发一次Subscribe)
/// </summary>
/// <param name="messageList">消息列表表示所有影响到的数据变更(会受BuildLimit限制,没有查询完成的会在下一次查出)</param>
public override void Subscribes(List<SubscribeMessage<T>> messageList)
{
foreach (var message in messageList)
{
Console.WriteLine($"执行动作:{message.Operation},更新的表:{message.TableName},更新的id:{message.Result.GetId()}");
}
}

以上订阅的优先级:

(三)订阅启动

启动监听所有继承自Subscribe<T>的类,在应用程序启动时执行即可

ApplicationProgram.Run();

如果是基础BaseSubscribe<T>中间基类需要定义成abstract,例如

  /// <summary>
/// 基础配置类需要定义成abstract
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseSubscribe<T> : Subscribe<T>
where T : class, IBaseEntity
{
}

关闭监听,在应用程序退出时执行即可

ApplicationProgram.Close();

(四)其他配置

builder.BuildCdcConfig(new CdcConfig
{
//扫描间隔(每次扫描变更表的间隔,单位毫秒) 默认10000毫秒/10秒
ScanInterval = 10000, //变更捕捉文件在DB保存的时间(默认三天)
Retention = 60 * 24 * 3, //是否首次扫描表全部数据再监听变更(默认false)
IsFirstScanFull = false, //每次检索的变更量(默认10条)
Limit = 10, //变更扫描的偏移量位置(默认从最后中止处开始)
OffsetPosition = OffsetPositionEnum.Abort
})

框架开源,完整框架源码可以去Github上下载:

https://github.com/a935368322/Kogel.Subscribe.Mssql

如有问题也可以加QQ群讨论:

技术群 710217654

[Kogel.Subscribe.Mssql]SQL Server增量订阅,数据库变更监听的更多相关文章

  1. sql server 警报管理,实时监听数据库动向,运筹帷幄之中

    工作这么多年了,无论是身边的同学还是同事,发现只要搞程序员的都有一个通病---懒.懒到谁都不愿意加班,尤其是"义务"加班.即使大家都不愿意加班,但是很多时候项目赶着上线或者上线之后 ...

  2. 使用SQL Server Audit记录数据库变更

        最近工作中有一个需求,就是某一个比较重要的业务表经常被莫名其妙的变更.在SQL Server中这类工作如果不事前捕获记录的话,无法做到.对于捕获变更来说,可以考虑的选择包括Trace,CDC. ...

  3. SQL Server CDC配合Kafka Connect监听数据变化

    写在前面 好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备.组建.招兵买马,到现在稳定开搞中,期间踏过无数的火坑,也许除了这篇还很写上三四篇. 进入主题, ...

  4. Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014

    Atitit.数据库新特性 mssql sql server 2008 SQL2012 SQL2014 1. Sql2012 新特性 1 1.1. 增加了Sequence对象. 1 1.2. 新的分页 ...

  5. 【SQL Server复制】数据库复制:修改表结构、新增表、新增存储过程 会被复制到订阅服务器?

    转自:https://www.cnblogs.com/happyday56/p/3849018.html 关键字:sql server复制 [SQL Server高可用性]数据库复制:修改表结构.新增 ...

  6. SQL Server 中心订阅模型(多发布单订阅)

    原文:SQL Server 中心订阅模型(多发布单订阅) 大多数SQL Server 复制拓扑都是基于中心发布模型,它是由一个发布复制到一个或者多个订阅.另一个复制模型是中心订阅模型,它使用事务复制由 ...

  7. 【SQL Server高可用性】数据库复制:SQL Server 2008R2中通过数据库复制,把A表的数据复制到B表

    原文:[SQL Server高可用性]数据库复制:SQL Server 2008R2中通过数据库复制,把A表的数据复制到B表 经常在论坛中看到有人问数据同步的技术,如果只是同步少量的表,那么可以考虑使 ...

  8. SQL Server 2008 master 数据库损坏解决总结

    SQL Server 2008 master数据库损坏后,SQL SERVER服务启动失败,查看错误日志,你会看到下面错误信息: 2015-10-27 10:15:21.01 spid6s      ...

  9. SQL Server删除distribution数据库二

    以前总结过一遍博文SQL Server删除distribution数据库,里面介绍了如何删除distribution数据库.今天介绍一个删除distribution的特殊案例, 在这之前,我不知道这个 ...

  10. SQL SERVER 2012 修改数据库默认位置不立即生效

    今天修改SQL SERVER 2012的数据库默认位置:即数据文件.日志文件默认位置时遇到一个问题,单击"服务器属性"(Server Properties)--> 数据库设置 ...

随机推荐

  1. k8s中计算资源策略 Limit Range

    文章转载自:https://www.kuboard.cn/learning/k8s-advanced/policy/lr.html 默认情况下,容器在 Kubernetes 集群上运行时,不受 计算资 ...

  2. 延申三大问题中的第一个问题处理---原先shell脚本中启动jar文件命令的配置,附加参数等

    经过一系列的试错,最终采用的解决办法如下: 采用的配置文件 附加的启动参数 或者把这些都给统一添加到ConfigMap中

  3. LeetCode - 数组的旋转总结

    1. 数组的旋转总结 数组的旋转指的是将数组的最后若干个数提前到数组前面,数组的翻转指的是将数组的顺序颠倒.旋转可以通过多次翻转实现. 数组的翻转很简单,通过双指针来实现:交换数组的第一个数和最后一个 ...

  4. C#中Math.Round()实现中国式四舍五入问题

    C#中的Math.Round()并不是使用的"四舍五入"法.实际上是四舍六入五取偶. 对于这个问题我们常见的解决方式是使用MidpointRounding.AwayFromZero ...

  5. Nebula Graph介绍和SpringBoot环境连接和查询

    Nebula Graph介绍和SpringBoot环境连接和查询 转载请注明来源 https://www.cnblogs.com/milton/p/16784098.html 说明 当前Nebula ...

  6. python-D2-计算机与编程语言

    计算机五大核心 控制器 计算机的指挥系统,可以控制计算机硬件的整体运行 运算器 实现算术运算和逻辑运算 控制器和运算器结合起来就是cpu,也称为中央处理器,是整个电脑的核心. 存储器 分为两类,非永久 ...

  7. Vue学习之--------组件在Vue脚手架中的使用(代码实现)(2022/7/24)

    文章目录 1.第一步编写组件 1.1 编写一个 展示学校的组件 1.2 定义一个展示学生的信息组件 2.第二步引入组件 3.制作一个容器 4.使用Vue接管 容器 5.实际效果 6.友情提示: 7.项 ...

  8. SQL 报表制作和整形

    本文章主要介绍制作报表的查询,这些查询通常需要考虑与报表相关的格式设置,还需使用多级聚合. 1.将结果集转置为一行(行转列) 将多行中的值转换为单行中的列. 情景:有一个员工表,统计出一个结果集,显示 ...

  9. Log4shell漏洞研究及其挖矿案例分析

    本文首发于云影实验室,为本人创作,现转载到个人博客,记录一下. 原文链接:https://mp.weixin.qq.com/s/O2xHr2OEHiga-qTnbWTxQg Apache Log4j是 ...

  10. 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理

    在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件 ...