{"id":16640283,"url":"https://github.com/yuzd/canalsync","last_synced_at":"2025-10-30T09:30:54.090Z","repository":{"id":34929257,"uuid":"181268193","full_name":"yuzd/CanalSync","owner":"yuzd","description":"canal middleware for netcore","archived":false,"fork":false,"pushed_at":"2022-08-29T08:25:38.000Z","size":662,"stargazers_count":23,"open_issues_count":1,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-02T07:41:19.503Z","etag":null,"topics":["canal","canal-server","dbsync","rabbitmq","redis"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yuzd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-14T06:17:32.000Z","updated_at":"2024-03-26T05:30:50.000Z","dependencies_parsed_at":"2023-01-15T10:35:41.352Z","dependency_job_id":null,"html_url":"https://github.com/yuzd/CanalSync","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuzd%2FCanalSync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuzd%2FCanalSync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuzd%2FCanalSync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuzd%2FCanalSync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yuzd","download_url":"https://codeload.github.com/yuzd/CanalSync/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238950485,"owners_count":19557533,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["canal","canal-server","dbsync","rabbitmq","redis"],"created_at":"2024-10-12T07:08:22.776Z","updated_at":"2025-10-30T09:30:53.641Z","avatar_url":"https://github.com/yuzd.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CanalSync\ncanal 是阿里巴巴开源的一款基于数据库增量日志解析,提供增量数据订阅\u0026消费,目前主要支持了MySQL(也支持mariaDB)。\n我开发的这个CanalSync项目是基于canal-server之上的数据库同步\u0026消费中间件，用于可快速搭建消费canal-server的项目。\n目前我已实现并开源了如下：\n\n1. 数据消费传输到redis组件\n2. 数据消费传输到rabbitmq组件\n3. 数据消费传输到mysql数据库组件\n\n# 示意图\n\n![image](https://images4.c-ctrip.com/target/zb0215000000y2ok436F1.png)\n\n## Nuget：\n### 1. 接收canal-server的消息中间件：\nInstall-Package Canal.Server \n\n### 2. 解析canal-server消息转出可执行sql的中间件：\nInstall-Package Canal.SqlParse\n\n\n## 如何使用\n如果你需要写一个数据消费传输到XXXMQ，用不到反解析成sql的话，只需要引用 Canal.Server中间件。\n如果你需要写一个数据消费传输到XXXdb，得用到反解析sql中间件，需要同时引用Canal.Server 和 Canal.SqlParse 这2个中间件。\n\n## Canal.Server 如何使用\n1. 引用 Canal.Server 并appsettings.json 配置canal-server的参数.如下图：\n\n![image](https://images4.c-ctrip.com/target/zb0715000000ycatg5F47.png)\n\n参数说明：\n![image](https://images4.c-ctrip.com/target/zb0t15000000xvnx4D8F2.png)\n\n2. 创建一个 消费类 必须要 实现： INotificationHandler\u003cCanalBody\u003e 接口，例如叫TestHandler\n```\n public class TestHandler:INotificationHandler\u003cCanalBody\u003e{\n        public Task Handle(CanalBody notification)\n        {\n            //写消费逻辑\n\n            return Task.CompletedTask;;\n        }\n    }\n    \n```\n3. 在startUp 使用并注册 该消费类\n```\n      //注册了之后 canal-server有新的消息就会进入到TestHandler的Handle方法\n      services.AddCanalService(produce =\u003e produce.RegisterSingleton\u003cTestHandler\u003e());\n```\n\n## Canal.SqlParse 如何使用\n目前只实现了解析mysql的逻辑，未来会加入sqlserver的解析逻辑!!\n\n```\n      //注册使用 connectionString是mysql的数据库连接字符串\n      services.AddMysqlParseService(connectionString);\n      \n      // 计划中还未实现\n      //services.AddSqlserverParseService(connectionString);\n```\n在类的构造方法可注入：\n\n![image](https://images4.c-ctrip.com/target/zb0d15000000xu5pq07B3.png)\n\n如上图，代表将canal-server的数据直接在另外的mysql库里面执行，等于2个mysql数据进行互相同步。\n\n## 欧洲与中国的2个mysql库 使用上述方法进行同步的测试\n**结果： 同步速度在100~200qps**\n![image](https://images4.c-ctrip.com/target/zb0u15000000xvmizF51C.png)\n\n## TODO\n消费端改成用air2来拉取\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuzd%2Fcanalsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyuzd%2Fcanalsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuzd%2Fcanalsync/lists"}