浅议分布式链路追踪与日志的整合
浅议分布式链路追踪与日志的整合 最近阅读了一篇关于分布式链路追踪和日志系统整合的文章,主要介绍了在.NET中利用Activity、ActivitySource和ActivityListener等API实现分布式追踪的方法。这些API可以被视为微软对OpenTelemetry规范的实现,其中每个Activity对应一个Span。文章还介绍了如何利用自定义TraceId和NLog.DiagnosticSource等工具实现将TraceId渲染到日志中,以实现更好的日志查询和分析。最后,作者分享了如何利用OpenTelemetry SDK自动采集HttpClient和ASP.NET Core的诊断信息,并探讨了分布式追踪与日志整合的实践方法。文章以深入浅出的方式介绍了相关概念和技术,提供了有关链路追踪和日志系统整合的有益见解。
关于 Git 大文件上传这件小事
关于 Git 大文件上传这件小事 在这篇文章中,作者分享了在使用Git时遇到的大文件上传问题以及如何应对。作者提到了Git LFS扩展的使用方法,包括安装、追踪文件和提交大文件的步骤。此外,文章还介绍了在提交大文件后如何处理历史记录中的大文件以及通过git filter-branch命令重写提交历史的方法。最后,作者总结了文章的主要内容,强调了对Git LFS和大文件处理的重要性,以及在解决问题过程中可能遇到的挑战。
EFCore 实体命名约定库:EFCore.NamingConventions 在软件开发中,数据库是一个重要话题,有不同的流派,一些人支持手写SQL,另一些喜欢ORM。介绍了EFCore.NamingConventions库,可在EFCore中指定实体命名约束规则,简化属性与数据库表字段映射,提高团队效率。示例展示了使用SnakeCaseNamingConvention生成数据库表字段,强调约定大于配置的重要性。团队应记录数据库规范,以避免配置混乱或新人不了解约定。这个库有利于标准化命名,提高开发效率。
浅议 EF Core 分库分表及多租户架构的实现 Payne在他的博客中探讨了在EF Core中实施分库、分表和多租户架构的可能性。他介绍了分库、分表的目的是提高数据库查询性能,讨论了路由策略以及可能带来的问题。针对多租户架构,他展示了如何使用`HasQueryFilter()`方法在单数据库中实现多租户隔离。最后,他强调了这些方法的适用性与潜在问题,并鼓励读者根据业务需求进行取舍。 Payne的博客提供了深入的技术讨论,展示了他对技术的追求和探索精神。
基于选项模式实现.NET Core 的配置热更新 本文主要探讨了.NET Core 中实现配置热更新的机制和方法。配置热更新指的是在应用程序运行时,能够感知并应用配置文件的变更而无需重启应用。文章首先介绍了.NET Framework 中的配置文件热更新能力,然后指出在分布式环境中这种机制的局限性,尤其是容器化部署时配置文件的复杂性。接着,文章提出了利用 Redis 的发布-订阅模式来实现配置更新的策略,并详细讨论了 .NET Core 中的选项模式(Options),解释了如何使用类来访问强类型的配置信息,并展示了如何通过依赖注入在服务层或控制器层使用配置信息。文章进一步深入探讨了 .NET Core 中的三个与选项模式相关的接口:`IOptions<TOptions>`、`IOptionsSnapshot<TOptions>` 和 `IOptionsMonitor<TOptions>`,它们分别对应不同的生命周期管理和配置更新响应方式。特别地,`IOptionsMonitor<TOptions>` 能够实现配置的热更新,这对于需要实时响应配置变更的场景非常重要。文章还提到了 `IChangeToken` 接口,它为配置提供者(如文件、环境变量等)提供了一种监听和响应变更的能力。此外,介绍了如何通过实现`IConfigurationSource` 和 `IConfigurationProvider`接口来创建自定义配置源,以适应不同的配置存储和更新策略,例如基于 Redis 的发布-订阅模型。最后,文章通过一个基于Redis的简单配置中心示例,展示了如何实现自定义配置源,并强调了在分布式系统中配置管理的重要性和灵活性。通过这篇文章,读者可以深入理解 .NET Core 中的配置热更新机制,以及如何通过自定义配置源来适应不同的应用场景。
Dapper.Contrib 在 Oracle 环境下引发 ORA-00928 异常问题的解决 本文讨论了在使用 Dapper.Contrib 操作 Oracle 数据库时遇到的 ORA-XXXXX 错误,根本原因在于 Dapper.Contrib 未实现 OracleSqlAdapter,这与对自增 ID 的支持导致的 SQL 标准差异有关。文章指出不同数据库对自增 ID 实现方式不同,Oracle 需要序列,增加了维护工作量,且 Dapper.Contrib 底层设计不合理,缺乏扩展接口,违反开闭原则。作者提出了解决方法,包括自定义OracleSqlAdapter和扩展方法,以适配Oracle环境下的Dapper.Contrib使用。
利用 MySQL 的 Binlog 实现数据同步与订阅(下):EventBus 篇 这篇博客总结了关于利用MySQL的Binlog实现数据同步与订阅的过程。通过Python-Mysql-Replication项目读取Binlog并解析,然后将其发布到EventBus中,在.NET Core中提供Web API接口实现发布功能。针对不同事件编写对应的EventHandler来订阅这些Binlog,实现事件驱动。介绍了自定义序列化器解决JSON序列化问题,以及注册EventHandler和EventBus的步骤。最终实现了数据同步与订阅的想法,展示了Python读取Binlog、.NET Core消费Binlog和RabbitMQ Dashboard的效果。整个过程中,通过Binlog和EventBus实现了事件系统的统一调度,简化了事件处理流程,提高系统接口的吞吐性能。
利用 MySQL 的 Binlog 实现数据同步与订阅(中):RabbitMQ 篇 本文深入探讨了事件总线(EventBus)的概念、设计和实现,通过实现一个基于 RabbitMQ 的 EventBus,展示了发布-订阅模式在分布式系统中的应用。文章首先阐述了 EventBus 的设计原则和核心组件,包括事件发布、订阅与退订接口,以及事件处理器的注册机制。接着,通过具体的代码示例,详细解释了基于 RabbitMQ 的 EventBus 实现,包括消息的发布、订阅与取消订阅,以及事件处理流程。此外,文章还讨论了 RabbitMQ 的一些高级特性,如消息的持久化、死信机制、重试与超时策略,以及四种交换器模式。最后,作者对 EventBus 在领域驱动设计(DDD)中的作用进行了总结,并预告了下一篇博客将介绍如何通过 Python-Mysql-Replication 实现 Binlog 的发布。
利用 MySQL 的 Binlog 实现数据同步与订阅(上):基础篇 博主在周末闲暇之余撰写了一篇关于大数据时代内容管理系统同质化问题的博客,并提出了通过 Binlog 实现数据同步和订阅的解决方案。文章首先解释了 Binlog 的基本概念,即 MySQL 中的二进制日志文件,主要为数据库的主从复制和增量恢复服务。接着,介绍了 Binlog 的三种模式:Statement、Row 和 Mixed,并讨论了如何开启和配置 Binlog。文章进一步阐述了 Binlog 的用途,包括实现数据库审计和事件驱动,以及业界主流的 Binlog 处理方案,如 Canal、Maxwell 和 Python-Mysql-Replication。最后,博主分享了自己的构想,计划使用 RabbitMQ、.NET Core 和 Python技术栈来实现一个基于 Binlog 的事件驱动系统。整篇文章旨在探索如何摆脱重复性工作,实现系统间数据的高效流通和整合。
通过 EF/Dapper 扩展实现数据库审计功能 本文讨论了数据库审计的重要性和实现方式。审计是一种记录数据表中数据变更的机制,有助于追溯数据变更历史、通知相关人员以及排查错误数据。文章首先介绍了 EF 和 EF Core 中的实体跟踪功能,通过重写 DbContext 的 SaveChanges() 方法,利用 ChangeTracker 来捕获实体字段的变化,实现审计日志记录。然后,针对 Dapper 这类轻量级 ORM,提出了使用 Castle 动态代理库实现接口拦截,记录审计日志的方案。此外,文中还探讨了领域事件在数据同步中的应用,强调通过事件驱动来处理数据变更,可提高效率并减少代码耦合。最后,文章总结了 EF Core 和 Dapper 实现审计功能的方法,并提出了基于领域事件的同步策略,以优化数据同步过程。
使用 Liquid 实现简单的数据交换 在这篇博客中,介绍了在接口对接中涉及到的数据交换问题,着重讨论了通过Liquid模板引擎实现接口级别的数据交换。Liquid是一种模板语言,通过其语法可以进行数据绑定、流程控制和过滤器的应用。通过实例展示了Liquid在数据交换中的应用,以及如何使用Liquid在.NET环境下进行模板解析和渲染。最后指出了Liquid的实用性,提倡通过数据绑定让其他人能够更高效地进行数据处理。文章以此为基础,探讨了数据交换的概念,强调了通过Liquid可以实现文本模板编写、数据报文生成等功能。
关于单位转换相关问题的常见思路 作者在文章中讨论了其在工作过程中遇到的一个单位转换的问题,并通过不同方案进行解决。文章首先描述了作者感受到的工作压力,导致其反思人类问题的本质,而非寻求最优解。在具体业务场景中,作者讲述了客户要求将重量单位统一转换为吨,作者首先尝试了在视图增加字段的方式,但很快意识到需要更复杂的数据映射处理。通过使用 AutoMapper 工具,作者实现了重量单位的转换,同时避免了在映射规则中写入过多业务逻辑。此外,作者还提到了在设计数据库表结构时考虑单位转换的必要性,以及在实际应用中如何通过反射等技术在数据库层面进行单位转换。文章最终表达了对客户需要的积极回应和对工作中遇到的各种规则的适应,同时略微讽刺了工作中的加班文化以及个人对简单生活的向往。
浅析网站 PV/UV 统计系统的原理及其设计 文章主要讨论了如何设计一个 PV/UV 统计系统,以应对互联网产品流量分析的需求。首先介绍了PV(页面浏览量)和 UV(独立访客数)的概念,并探讨了在不同情况下对 PV/UV 的理解,如 AJAX和单页面应用中 PV 的统计方式。接着,提出了在前端通过埋点收集数据的共识,并讨论了后端处理数据的三种方法:使用 Nginx 的 access_log、Redis 的 Hyperloglog 和 LeanCloud 的 Hooks。文章详细描述了这三种方法的实现过程,并通过实例代码展示了如何应用这些技术进行数据统计。最后,作者分享了在设计统计系统时遇到的问题和对使用 Linux 服务器的重要性的认识,并提供了相关项目的 GitHub 链接,供读者参考。
由 DBeaver 与 PL/SQL 引发的数据库吐槽 作者因工作需要管理多种数据库,选择使用 DBeaver 工具以避免安装多个客户端。DBeaver 满足 80% 的工作需求,但作者在编写 Oracle 触发器时遇到 DBeaver 与 PL/SQL 不兼容的问题,表达了对 Oracle 的不满。文章讨论了 SQL 标准的不完善和数据库厂商私货的问题,导致脚本缺乏可移植性。作者还质疑 SQL 作为 DSL 的有效性,认为其扩展如 PL/SQL 和 T-SQL 引入了编程结构,但存在使用上的不便利。最后,作者对比了 Web 标准化和数据库标准化的不同情况,对甲骨文公司的市场行为表示不满,并以对数据库脚本的批评结束了文章。
基于 EF 的数据库主从复制、读写分离实现 本文介绍了实现数据库主从复制和读写分离的重要性和方法。主从复制通过创建与主数据库完全相同的从数据库来提供数据服务的连续性和提高性能。文章以 MySQL 为例,解释了主从复制的工作原理,包括二进制日志(binlog)和线程的交互。在ORM层面上,通过Entity Framework (EF) 中的 DbCommandInterceptor 拦截 SQL 命令,可以实现读写分离:所有 Select 查询操作通过从库执行,而 Insert/Update/Delete 操作通过主库执行。文章提供了具体的代码实现,包括主从库管理类 MasterSlaveManager 和拦截器 MasterSlaveDbInterceptor 的定义和使用。最后,讨论了在实际应用中可能遇到的问题,如事务处理、数据库连接管理以及在一主多从的情况下进行健康检查和负载均衡,鼓励读者深入研究这些高级主题。