- 博客(54)
- 资源 (2)
- 收藏
- 关注
原创 代码开发中的 fail on safe 策略:安全处理运行时错误
在代码开发的广袤领域中,fail on safe 策略是保障系统稳健运行的坚固盾牌。从敏锐的错误检测,到灵活多样的错误处理策略,再到全面的日志记录与监控,每一个环节都紧密相连,共同构建起抵御错误的防线。然而,随着软件系统的日益复杂和业务需求的不断变化,新的错误类型和挑战也会层出不穷。开发者们需要持续关注技术的发展趋势,不断优化和完善错误处理机制,以适应未来更加复杂多变的开发环境。
2025-04-11 06:30:00
262
原创 面向对象编程中 is-a 和 has-a 的区别及使用场景
在面向对象编程(OOP)的领域里,理解和运用正确的对象关系是构建健壮、可维护且高效软件系统的基石。其中,“is-a” 和 “has-a” 关系是两种最基本且重要的概念,它们不仅定义了类与类之间的关联方式,还深刻影响着整个软件架构的设计。本文将深入探讨 “is-a” 和 “has-a” 关系的本质区别,并通过实际案例分析它们各自适用的场景。
2025-04-10 06:30:00
1108
原创 深入了解 etcd gateway:分布式系统的网络桥梁
etcd gateway 本质上是一个简单的 TCP 代理,其主要职责是将网络数据转发到 etcd 集群。它具有无状态和透明的特性,既不会对客户端请求进行检查,也不会干扰集群的响应。这意味着在数据传输过程中,etcd gateway 仅仅起到一个 “搬运工” 的作用,保证数据能够准确、高效地在客户端和 etcd 集群之间流转,而不会对数据内容进行任何额外处理。从网络架构的角度来看,etcd gateway 就像是一个交通枢纽,连接着众多的客户端应用和 etcd 集群的各个节点。
2025-04-08 06:30:00
980
原创 分布式服务高可用设计的分散、均衡、隔离原则
在数字经济蓬勃发展的当下,分布式系统已深度嵌入各个行业,成为支撑大规模、高并发业务的基石。对于分布式服务而言,高可用性不再是锦上添花,而是关乎业务生死存亡的核心要素。分布式服务高可用设计蕴含一系列复杂且精妙的原则,其中分散、均衡与隔离原则堪称构建稳定可靠系统架构的关键支柱,从不同层面为系统的稳健运行保驾护航。
2025-04-07 06:30:00
1002
原创 警惕微服务架构过度拆分的陷阱
在当今的软件开发领域,微服务架构因其灵活性、可扩展性和易于维护等优势,受到了广泛的青睐。它将一个大型的应用程序拆分成多个小型、独立的服务,每个服务专注于特定的业务功能。然而,如同任何技术理念一样,微服务架构并非 “越细越好”。过度拆分微服务,反而可能引发一系列棘手的问题。
2025-04-06 06:30:00
856
原创 使用msys2在windows下编译ffmpeg
注意:此时编译的ffmpeg.exe, ffplay.exe, ffprobe.exe还不能用,要想在windows下运行, 还依赖于MinGW64的部分动态库.打开DependenciesGui.exe ,把ffmpeg拖进去,查看缺少哪个库,就从C:\msys64\mingw64\bin里面拷贝哪个库。进入到git clone的ffmpeg目录下,创建一个ffmpeg_build目录用以存放编译的结果。8、进入ffmpeg_build目录,可以看到编译的结果。7、构建成功后运行以下命令编译和安装。
2025-04-05 06:30:00
535
原创 Rust 中的 Result 类型及处理方法
Result是一个枚举类型,在标准库中定义如下:Ok(T),Err(E),这里T代表操作成功时返回的值的类型,E代表操作失败时返回的错误类型。Result类型提供了一种统一的方式来处理可能成功或失败的操作结果。例如,当读取文件时,可能成功读取到文件内容,也可能因为文件不存在、权限不足等原因失败。此时就可以使用Result来表示操作结果:成功时Ok变体包含读取到的文件内容,失败时Err变体包含具体的错误信息。
2025-04-04 09:00:00
1254
1
原创 Rapid Application Development(RAD)方法论
RAD 是一种以用户为中心的软件开发方法,它强调快速迭代和增量式开发。与传统的瀑布式开发模型不同,RAD 并不遵循严格的线性步骤,而是通过一系列的迭代过程来逐步完善软件产品。其核心在于加速软件开发周期,尽可能快地将可用的软件版本交付给用户,以便获取及时反馈并进行改进。
2025-04-04 06:30:00
955
原创 理解rust里面的copy和clone
Clone trait 用于定义一种更通用、更灵活的复制行为。与Copy不同,实现Clone的类型在复制时,通常会涉及到更多的操作,不仅仅是简单的值复制。比如对于复杂的数据结构,可能需要递归地复制其内部的所有元素。当一个类型实现了Clone,调用clone方法会创建一个与原对象内容相同但在内存中独立的新对象。Copy是自动实现的,编译器会为满足一定条件(类型的所有字段都实现了Copy)的类型自动生成Copy实现。它是简单的按位复制,不涉及复杂的逻辑。
2025-04-03 15:38:27
987
原创 mysql 索引
索引是一种数据结构,它是对数据库表中一列或多列的值进行排序的结构。通过索引,数据库可以快速定位到满足特定条件的数据行,而无需扫描整个表。打个比方,索引就如同书籍的目录,通过目录可以快速找到所需的章节内容,而不必逐页翻阅整本书。索引在 MySQL 数据库中是提升查询性能的重要工具。通过合理地创建和使用索引,能够显著提高数据库应用的响应速度,为用户提供更好的体验。然而,索引的使用并非越多越好,需要根据实际的业务需求和数据特点,权衡利弊,选择合适的索引类型和创建策略,并做好索引的维护工作。
2025-04-03 06:30:00
641
原创 项目开发中编程语言的选择
在当今数字化时代,软件开发项目如雨后春笋般涌现。而在启动一个项目时,选择合适的编程语言是首要且关键的决策之一。编程语言犹如工匠手中的工具,选对了它,项目开发便能事半功倍;反之,则可能困难重重。
2025-04-02 06:30:00
867
原创 微服务架构中的熔断机制
当一个服务调用另一个服务时,如果被调用服务出现故障(如超时、异常等)的次数达到一定阈值,熔断器就会 “熔断”,即后续对该服务的调用不再实际执行,而是立即返回一个预设的默认值或者错误信息,就像电路中的保险丝熔断后切断了电流通路一样。在未来,随着微服务架构的进一步普及和发展,熔断机制也将不断演进和完善,为构建更加稳定、高效的分布式系统提供坚实的保障。然而,随着系统规模的不断扩大和服务间依赖关系的日益复杂,一个服务的故障可能会像多米诺骨牌一样,迅速波及到整个系统,引发级联故障,导致系统的整体崩溃。
2025-04-01 07:00:00
379
原创 负载均衡架构设计概念解析
负载均衡(Load Balancing)是一种将网络流量均匀分配到多个服务器或计算资源上的技术,旨在优化资源利用、提高系统性能、增强可用性和容错能力。负载均衡架构在现代互联网应用中扮演着不可或缺的角色,通过合理选择架构模式、负载均衡算法以及健康检查机制,能够有效提升系统的性能、可用性和扩展性。随着技术的不断发展,未来负载均衡架构将朝着智能化、自适应方向发展,能够根据实时流量、服务器状态等因素自动优化负载分配策略,为日益复杂的互联网业务提供更强大的支撑。
2025-03-31 07:00:00
1410
原创 POSIX 和 System V IPC的区别
POSIX 和 System V 是两种不同的进程间通信(IPC)机制,它们在以下方面存在区别:msggetmsgsndmsgrcvsemgetsemopshmgetshmatmq_openmq_sendmq_receivesem_opensem_waitsem_post。
2025-03-30 08:23:08
1169
原创 低代码框架
例如,OutSystems 和 Mendix 等专业低代码平台,用户只需进行简单的操作,就能开发出复杂的企业级应用,无需花费大量时间编写代码。例如,在开发一个客户关系管理系统时,只需定义客户、订单等数据模型,系统就能自动生成对应的数据库表结构、CRUD 操作以及相应的界面,开发者仅需在此基础上进行少量的定制化开发。低代码框架应运而生,以其独特的开发模式,打破了传统软件开发的壁垒,为企业和开发者带来了全新的解决方案。此外,低代码框架减少了代码量,降低了因代码错误导致的维护成本,为企业节省了大量的开支。
2025-03-30 06:00:00
444
原创 linux inotify api, 监控文件事件
(如创建、修改、删除等)。相比传统的轮询(polling)机制,inotify 通过事件驱动的方式显著提升了效率,是构建文件同步工具、配置热加载、日志监控等功能的底层核心。2、使用 inotify_add_watch() 追加新的监控项,或修改现有监控项。(inode notify)是一种内核子系统,允许应用程序。4、使用 inotify_rm_watch() 移除监控项。3、使用 read 读取某一路径名所发生的事件。机制,以允许应用程序监控文件事件。系统调用可创建一新的。
2025-03-29 06:00:00
405
原创 微服务边界划分的三维法则:完整性、一致性与正交性
在微服务架构中,服务边界的合理划分是决定系统成败的关键。一个糟糕的划分可能导致服务间高度耦合、数据一致性灾难和运维复杂度飙升,而科学的边界设计则能让系统像乐高积木般灵活组合。本文将从、和三个维度,揭示微服务边界划分的核心逻辑。
2025-03-28 06:00:00
518
原创 c++ 中的std::reduce,一个灵活且高效的累积算法
2、自定义操作:例如获取一个容器中最大值,如果这个最大值小于某一个设定值,那么返回值为设定值。它用于对序列中的元素进行累积计算,并支持并行执行,适用于大规模数据处理。可以看出,使用reduce并开启并行执行策略要比使用accumulate快很多。是C++17引入的一个灵活且高效的累积算法,位于。1、基础功能:容器内数据相加求和。
2025-03-27 10:26:41
322
原创 简介MySQL里的事务
想象你要给朋友转账500元,这个操作包含两个步骤:你的账户减少500元,朋友的账户增加500元。这两个操作必须同时成功或同时失败,否则就会出现你钱扣了对方没收到的情况。事务就是数据库里的一组操作指令,它们像被装进了一个不可分割的"操作包"。
2025-03-27 06:00:00
886
原创 c++20 source_location 追踪代码执行路径
是 C++20 中引入的一个工具类,旨在以类型安全且灵活的方式捕获源代码的位置信息(如文件名、行号、函数名等),替代传统的预处理器宏(如__LINE__
2025-03-26 15:03:59
412
原创 c++ std::optional ,让代码更清晰安全
是 C++17 引入的模板类,用于表示一个可能包含值或不包含值的容器。它适用于函数可能返回无效结果、对象初始化可能延迟等场景,避免了使用特殊值(如-1nullptr)或额外的错误标志,使代码更清晰安全。
2025-03-26 06:00:00
243
原创 微服务中的 Saga 模式
Saga 就是:拆大活、留后路。把一个跨服务的复杂操作拆成多个小步骤,每一步都准备好“撤销方案”,确保最终数据不会错乱。
2025-03-25 06:00:00
583
原创 golang 泛型
Go 中的泛型通过类型参数和类型约束,使开发者能够编写更加灵活、高效的代码。尽管泛型强大,但应根据具体场景选择最合适的工具。在简单场景中,接口可能更为直观,而泛型则适合需要类型安全的复杂逻辑。合理使用泛型可以显著提升代码的可维护性和复用性。自 1.18开始golang正式支持泛型,再也不需要使用反射或是go generation这些难用的技术了。编程支持泛型最大的优势就是可以实现类型无关的通用容器了,例如列表,队列,栈等。Go 的泛型设计注重简单性和实用性。Go 使用接口定义类型约束,指定类型参数的范围。
2025-03-24 06:00:00
235
原创 Google的BeyondCorp 零信任网络
Google 的 BeyondCorp 是一种零信任安全框架1。简单来说,就是抛弃了传统的以网络边界为基础的安全防护模式,不再认为只要在企业内部网络里就都是安全的,而是把访问控制的重点放在每个用户和设备上。
2025-03-23 05:50:15
1068
原创 软件架构设计关键点:平衡高可用、性能、扩展性及成本的系统化实践
优秀的软件架构需要在CAP定理的约束下寻找最优解:电商大促场景优先保证AP特性,而银行转账系统必须满足CP要求。实践中建议采用架构决策记录(ADR)方法,例如在初期选择单体架构降低复杂度(如GitLab),当团队规模超过200人时逐步向微服务迁移。通过持续进行架构量化评估(如ATAM方法),结合业务发展阶段动态调整技术路线,最终实现技术价值与商业目标的高度统一。在云原生时代,架构师的角色正从技术决策者进化为价值创造者,通过构建弹性、智能、可持续的架构体系,助力企业在数字化竞争中赢得先机。
2025-03-22 06:00:00
935
原创 理解音频PCM
PCM(Pulse Code Modulation)也被称为脉冲编码调制,是数字通信的编码方式之一。PCM中的声音数据没有被压缩,它将输入的模拟信号进行采样、量化和编码,用二进制进行编码的数来代表模拟信号的幅度,即标准的数字音频数据。
2025-03-21 05:18:27
572
原创 网页的动静分离
动静分离”就是把用户请求的数据(如 HTML 页面)划分为“动态数据”和“静态数据”。静态资源图片、视频、音频等媒体文件HTML、CSS、JavaScript 等前端资源固定不变的配置文件动态资源PHP、JSP、ASP 等脚本文件需要数据库交互的个性化数据注意:动态数据不等于动态页面,例如很多媒体类的网站,某一篇文章的内容无论是谁访问,效果是一样的。虽然它是动态页面,但也把它算成一个典型的静态数据。
2025-03-20 07:03:27
369
原创 服务指标衡量的一些术语
举例来说,在一个系统的 100 个请求 中,99 个都在 1 秒左右返回了,还有一个 100 秒还不返回,那平均时间会大于 (99 x 1 + 1 x 100) / 100,大约等于 2 秒,这显然不能反映系统的真实情况。因为那一个耗时特别长 的请求其实是一个异常,而非正常的请求,正常的请求平均时间就是 1 秒,而 TP99 就比 较能反映真实情况了,因为 TP99 就可以达到 1 秒。例如,若TP99=500ms,则99%的请求响应时间≤500ms,剩余1%大于500ms,有的可能高达数秒。
2025-03-19 06:17:00
920
原创 linux 高级IO函数sendfile, 文件零拷贝技术
如果文件过大的话,就循环的多次使用系统调用(read和write),不断的将数据从内核缓冲区中拷贝到用户缓冲区,再从用户缓冲区拷贝到内核缓冲区,造成了很大的浪费。在2.6.33之前的linux内核版本中,out_fd必须是一个socket,从2.6.33版本开始,out_fd可以是一个标准的文件描述符。在Linux系统中,sendfile() 在2个文件描述符之间传递数据(完全在内核中),避免在内核缓冲区和用户缓冲区之间进行数据拷贝。count:要发送的数据量,以字节为单位。out_fd:输出文件描述符。
2025-03-18 09:57:19
164
原创 RTSPtoWeb, 一个将rtsp转换成webrtc的开源项目
RTSPtoWeb是一个开源项目,旨在将RTSP流转换为可在现代web浏览器中消费的格式,如(MSE)、WebRtc或HLS。该项目完全使用golang编写,不依赖于ffmpeg或gstreamer,确保了高效的性能和轻量级的部署。
2025-03-17 05:57:34
958
原创 rust里面的self和Self,傻傻的分不清楚
在 Rust 中,self和Self是两个容易混淆但用途不同的关键字。Self是一个类型别名,self在rust中是一个关键字,用于引用当前对象的实例。可以简单的把Self和self理解为c++里面的类和对象。
2025-03-16 05:21:34
342
原创 rust 的Clone
编程语言中一个核心特质(trait), 定义了类型如何安全、明确地创建其值的深拷贝(deep copy)。如果要想Item类的变量赋值后所有权继续有效,就需要Item类实现clone()。报错的意思是变量a的所有权已经被移动到b,所以println!下面用实例来演示Clone的作用,先看一下如下的代码,注意此代码编译不过。方案一:手动为Item类实现trait Clone。
2025-03-15 07:42:27
1008
原创 rust 中的package、crate、module
初学rust,对crate和mod的使用总是感到不太顺利,特此记录一下。当我们用cargo 创建一个新项目时,默认就创建了一个package。crate:一个模块的树形结构,它形成了库或二进制项目。module:一个module是用来组织代码的逻辑单位,用于拆分一个crate中的代码。
2025-03-14 08:03:21
1446
原创 浅谈软件开发中的过程控制
首先,在团队的组建过程中,选对合适的人尤为重要。团队成员的选择也会受到多方面的影响,例如项目的预算,个人的经验和能力。例如项目管理工具(jira),版本控制工具(git),持续集成工具(jenkins),质量保障工具(SonarQube),构建部署工具(docker,k8s),文档协作工具,运维监控工具(prometheus+grafana)等。但在 现实情况中,需求不可能稳定,所以我们要想法设法的让设计具有灵活性,采用增量的开发方法,循序渐进的发布版本逐渐的增强软件功能,而不是一次做完。
2025-03-13 07:51:27
214
原创 使用 Golang 操作 MySQL
在Go语言中,操作SQL数据库,通常会用到一些第三方库来简化数据库的连接、查询和操作过程。直接上代码来演示基本的创建,插入,更新,删除操作。
2025-03-12 08:43:55
226
原创 MongoDB 聚合 golang实现
MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。聚合通常是一系列操作,类似与linux管道的概念,后续的操作都会基于前一个操作的结果进行处理。例如我用如下结构体表示一个企业的员工。语句中的 count(*)。
2025-03-11 05:51:20
990
1
原创 mongodb条件查询,golang实现
假设我们在mongodb上建立一个数据库(database),代表公司。再建立一个集合(collection),代表部门,集合里面的每一条文档(document)表示一个员工的信息。在 MongoDB 中,条件操作符用于在查询文档时进行过滤,这些操作符可以分为以下几类:比较操作符、逻辑操作符、元素操作符、数组操作符、以及其他常用操作符。如果文档里面的字段为数组类型,可以用数组操作符进行查询匹配。例如要查询年龄大于35的男员工。例如要查询年龄小于30的员工。查询年龄为21,37的员工。
2025-03-10 08:09:40
301
原创 搭建测试用的redis集群 访问失败小记
下载redis源码,编译成功后,进入utils/create-cluster目录,运行。vim打开redis目录下的utils/create-cluster文件,修改。redis运行在virtual box虚拟机的ubuntu中。golang编写的redis客户端代码运行在windows下。在windows上 下载redis客户端,连接,运行,报错。再在windows下访问linux的redis,成功。在linux上运行redis客户端程序,ping正常。在windows下编写访问redis代码。
2025-03-08 09:50:35
1021
【多媒体处理】Windows下FFmpeg编译与VSCode调试
2025-04-05
【计算机求职】计算机求职面试全流程指南:简历优化、笔试技巧及面试策略
2025-04-02
深入探究 MySQL 函数:功能、语法与应用
2025-04-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人