![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go
文章平均质量分 84
百里守约学编程
你会的越多,不会的越多。
展开
-
131. 面试中关于架构设计都需要了解哪些内容?
预先设定主键的生成规则,根据规则进行数据的分片路由,但这种方式会侵入商品各条线主数据的业务规则,更好的方式是基于分片元数据服务器(即每次访问分片前先询问分片元服务器再路由到实际分片),不过会带来复杂性,比如如何保证元数据服务器的一致性和可用性。大部分的系统,是要进行多轮拆分的,第一次拆分,可能就是将以前的多个模块该拆分开来了,比如说将电商系统拆分成订单系统、商品系统、采购系统、仓储系统、用户系统等等吧。因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,原创 2024-05-24 22:55:57 · 828 阅读 · 0 评论 -
130. MySQL表结构设计18条最佳实践原则
对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。等。后端开发的日常工作,需要不断的建库和建表,来满足业务需求。通常情况下,建库的频率比建表要低很多,所以,我们这篇文章主要讨论建表相关的内容。如果我们在建表的时候不注意细节,等后面系统上线之后,表的维护成本变得非常高,而且很容易踩坑。今天就跟大家一起聊聊,数据库建表的18个小技巧。文章中介绍的很多细节,我在工作中踩过坑,并且实践过的,非常有借鉴意义,希望对你会有所帮助。原创 2024-05-22 00:22:59 · 1048 阅读 · 0 评论 -
129.跨服务(跨数据库)多表存在大量数据依赖问题解决方案
相对1中介绍的原始方案,虽然还是需要先查商品表,然后用in查订单表,但是避免了RPC调用,上面的两次查询是在一个DB中进行的。如果需要关联使用商品数据的订单,采购服务的开发人员也无须关注商品数据的同步问题,只需要在查询时加上关联语句即可,实现了双赢。根据表结构不难发现,订单和采购单中保存的是商品ID,所以要实现上诉需求,需要先通过在商品表中获取到商品ID,然后去订单表查找订单,或去采购表查找采购单。每次更新商品时,先发布一条消息,订单与采购服务则各自订阅这条消息,消费消息各自更新商品冗余数据。原创 2024-05-21 00:33:56 · 861 阅读 · 0 评论 -
128.数据异构提升查询效率
冷热分离126.数据冷热分离方案与数据异构127.数据异构方案。本文介绍他们的实际应用场景实践。查询冷数据慢业务无法修改冷数据冷数据多到一定程度系统依旧扛不住此时如果需要解决以上问题,可以采用另外一种方案:使用查询分离优化业务主表数据大、查询缓慢的问题什么时候触发查询分离?如何实现查询分离?查询数据的存储系统选型?查询数据如何使用?查询分离的适用场景?当你在实际业务中遇到以下情形,则可以考虑使用查询分离解决方案。数据量大;所有写数据的请求效率尚可;查询数据的请求效率很低。原创 2024-05-20 23:46:34 · 947 阅读 · 0 评论 -
127.数据异构方案
何谓数据异构:把数据按需(数据结构、存取方式、存取形式)异地构建存储。比如我们将DB里面的数据持久化到Redis或者ES里面去,就是一种数据异构的方式。常见应用场景分库分表中有一个最为常见的场景,为了提升数据库的查询能力,我们都会对数据库做分库分表操作。比如订单库,开始的时候我们是按照订单ID作为分片键去分库分表,后来的业务需求想按照商家维度去查询,比如想查询某一个商家下的所有订单,就非常麻烦。异构维度数据异构总结起来大概有以下几种场景数据库镜像(DB→DB)数据库实时备份。原创 2024-05-20 23:21:10 · 972 阅读 · 0 评论 -
126.数据冷热分离方案
无论多么复杂的业务场景,一条数据的一生都体现在CRUD操作上,即创建、查询、修改、删除。一条数据随着时间的流逝,其价值也是在逐渐变小。数据存在的价值则是在于它被使用的程度,在不同的系统中,人们对于不同时期的数据有着不同的需求。比如12306、携程上的火车、机票订单,人们往往只关注30天之内的订单,而携程正是默认只保留30天的订单信息,超过30天的订单需要通过手机号查找。携程为什么要这么做?其实仔细想想不难明白,作为全国购票平台,每年数以亿计的订单,如果全部能够开放操作(CRUD),那么系统将会瞬间崩溃。原创 2024-05-20 22:51:15 · 788 阅读 · 0 评论 -
125. MySQL操作时的相关坑和处理技巧
在该程序刚部署成功,但数据库新字段还没来得及加的这段时间内,最新程序中,所有使用了新加字段的增删改查。才能把数据修复好,这种情况建议把表备份多次,如果出现异常,把数据回滚到最近的一次备份,可以节省很多重复操作的时间。这时所有涉及该字段的增删改查,都会报字段不存在的异常。正常情况下,如果程序新加了字段,一般是先在数据库中加字段,然后再发程序的最新代码。语句,通过上面的修改人和修改时间字段,在需要回滚时,能快速的定位到正确的数据。如果数据库中新加的字段非空,最新的程序还没发,线上跑的还是老代码,这时如果有。原创 2024-05-10 21:29:51 · 850 阅读 · 0 评论 -
124. explain | 索引优化 详解
对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。慢查询的确会导致很多问题,我们要如何优化慢查询呢?监控sql执行情况,发邮件、短信报警,便于快速识别慢查询sql打开数据库慢查询日志功能简化业务逻辑代码重构、优化异步处理sql优化索引优化其他的办法先不说,后面有机会再单独介绍。原创 2024-05-10 20:40:42 · 992 阅读 · 0 评论 -
123. SQL优化技巧汇总
sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说也要小得多。那么,如何优化sql语句呢?这篇文章从15个方面,分享了sql优化的一些小技巧,希望对你有所帮助。原创 2024-05-09 20:36:26 · 1069 阅读 · 0 评论 -
122. Kafka问题与解决实践
假如有家公司是做餐饮系统的,每天中午和晚上用餐高峰期,系统的并发量不容小觑。为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,保证出现线上问题时能够及时处理。有个后厨显示系统团队【面向的是厨师和服务员】,该系统属于订单【面向用户】的下游业务。用户点完菜下单后,订单系统会通过发kafka消息给我们系统,系统读取消息后,做业务逻辑处理,持久化订单和菜品数据,然后展示到划菜客户端。这样厨师就知道哪个订单要做哪些菜,有些菜做好了,就可以通过该系统出菜。原创 2024-05-07 20:32:24 · 1045 阅读 · 0 评论 -
121. 使用MQ可能存在的问题以及解决办法
MQ的重要性不言而喻。我们为什么要用mq?引入mq可能会出现哪些问题?如何解决这些问题?你心中是否有答案了呢?本文将会一一为你解答,这些看似平常却很有意义的问题。原创 2024-05-07 16:44:54 · 753 阅读 · 0 评论 -
120.幂等设计实践
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。比如:公交车刷卡,用户上车后刷码支付扣款成功,如果用户再次刷卡并扣款成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。因此,当你重复刷卡时,会提示:刷码重复【每次打开支付码都会生成一个新的支付二维码,一个码只会完成一次支付,多次扫同一个二维码,只有第一次能支付成功】。注意:数据库可能产生幂等性问题,但是幂等性问题不只发生在数据库。原创 2024-05-07 15:58:43 · 1012 阅读 · 0 评论 -
119. 再谈接口幂等性
在93. 通用防重幂等设计一文中,已经介绍过幂等的使用。该文将补充一些其他方案,不一定实用,但是是思路的延伸。有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。我们在项目中为了解决接口超时问题,通常会引入了重试机制。第一次请求接口超时了,请求方没能及时获取返回结果(此时有可能已经成功了),为了避免返回错误的结果(这种情况不可能直接返回失败吧?),于是会对该请求重试几次,这样也会产生重复的数据。mq消费者在读取消息时,有时候会读取到重复消息。原创 2024-05-07 15:03:46 · 862 阅读 · 0 评论 -
118. 性能优化技巧合集
本文梳理和总结了优化接口的18种方案,应该说比较系统了,大家在平时的学习或工作中也可以针对性地用起来。原文地址:https://mp.weixin.qq.com/s/fcUYP_6wFTp4y_tYSxf0xQ。原创 2024-05-06 21:04:41 · 728 阅读 · 0 评论 -
107. 如何使用Docker以及Docker Compose部署Go Web应用
使用Docker容器能够极大简化我们在配置依赖环境方面的操作,但同时也对我们的技术储备提了更高的要求。对于Docker不管你是熟悉抑或是不熟悉,技术发展的车轮都滚滚向前。原文地址:https://www.liwenzhou.com/posts/Go/deploy-in-docker/原创 2024-03-12 16:40:08 · 1133 阅读 · 0 评论 -
106. Dockerfile通过多阶段构建减小Golang镜像的大小
多阶段构建允许多个不同的构建过程,这些构建可以完全从不同的基础镜像构建,选择性地将文件从一个阶段传递到下一个阶段,从而剥离最终镜像中所有不必要的文件。我会说是的,但是为了实验的缘故,我们还是尽量挑战一下极限。我们继续沿着多阶段构建的道路前进,但这次在我们的第二阶段,我们将不再使用。差异可能会产生巨大的影响,在其余的情况下,你最终会在生产中得到一个完全没有任何工具的容器,我完全不推荐这样做。CGO_ENABLED=0 是至关重要的,如果我们不构建自包含的可执行文件,多阶段构建过程将无法工作。原创 2024-03-12 15:50:05 · 560 阅读 · 0 评论 -
105. Dockerfile详解
Dockerfile是用于构建Docker容器镜像的文本文件,它包含了一系列指令和配置,用于描述如何组装一个Docker容器的环境。通过Dockerfile,你可以自动化地构建镜像,确保在不同的环境中都可以复现相同的容器。Dockerfile中的指令可以指定从哪个基础镜像开始构建、复制文件到镜像中、安装软件包、设置环境变量、暴露端口、运行命令等等。每个指令都会在镜像的构建过程中创建一个新的镜像层,这些层构成了最终镜像的结构。这种分层结构让镜像的构建更加高效,同时也方便了镜像的复用和共享。以下是一个简单的。原创 2024-03-12 11:54:27 · 1024 阅读 · 0 评论 -
104. Go单测系列4---编写可测试的代码
本文是Go单测系列的最后一篇,在这一篇中我们不再介绍编写单元测试的工具而是专注于如何编写可测试的代码。编写可测试的代码可能比编写单元测试本身更加重要,可测试的代码简单来说就是指我们可以很容易的为其编写单元测试代码。接下来,我们将通过几个简单示例来介绍如何编写可测试的代码。原创 2024-03-11 21:03:25 · 1053 阅读 · 2 评论 -
103. Go单测系列3---mockey与convey综合实战
工作中,随着业务的快速发展,代码量级和复杂度也会随之快速增长,面临的稳定性挑战越来越大。单测作为稳定性保障的重要一环越来越受到重视,编写单元测试应该成为程序员的基本素养。之前写单元测试都是基于go自己的test方式,基本就是在线下跑通流程,遇到下游的接口无法访问时,只会束手无策。后来了解到一些单测工具,市面上已有很多成熟的单测工具,本文不会比较各种工具的优劣,而是结合自身经验介绍本人在工作时常用的工具。原创 2024-03-11 20:35:23 · 1811 阅读 · 1 评论 -
102. Go单测系列2---goconvey的使用
GoConvey是一个非常非常好用的Go测试框架,它直接与go test集成,提供了很多丰富的断言函数,能够在终端输出可读的彩色测试结果,并且还支持全自动的Web UI。安装如果需要使用goconvey的Web UI程序,请执行下面的命令安装可执行程序。如果只是想在项目中引入依赖,只需要在项目目录中执行以下命令。使用示例我们使用goconvey来为最开始的基础示例中的Split函数编写单元测试。原创 2024-03-11 20:33:44 · 544 阅读 · 1 评论 -
101. Go单测系列1---使用monkey打桩
单元测试中十分常用的打桩工具,它在运行时通过汇编语言重写可执行文件,将目标函数或方法的实现跳转到桩实现,其原理类似于热补丁。Debug 模式下跑单个测试时会自动带上该参数,Run 模式下跑单个测试或者跑一个包的测试则需要手动带上该参数。但是当你编写代码的时候这个库还没实现,或者这个库要经过内网请求但你现在没这能力,这个时候要为。熟练使用各种打桩工具能够让我们更快速地编写合格的单元测试,为我们的软件保驾护航。不是线程安全的,所以不要把它用到并发的单元测试中。不支持内联函数,在测试的时候需要通过命令行参数。原创 2024-03-11 20:12:16 · 653 阅读 · 0 评论 -
100. Go单测系列0---单元测试基础
本文介绍了Go语言单元测试的基本用法,通过为Split函数编写单元测试的真实案例,模拟了日常开发过程中的场景,一步一步详细介绍了表格驱动测试、回归测试和常用的断言工具的使用。在下一篇中,我们将更进一步,详细介绍如何使用httptest和gock工具进行网络测试。原创 2024-03-11 19:44:17 · 1280 阅读 · 1 评论 -
99. 数据库连接数设置多少合适?
很多工程师习惯于使用一个组件时,参数设置依赖于默认值。或者有时候希望依赖数据分析获取到更合适的值,最终发现考虑的数据过于片面或者数据难以收集最终还是拍脑袋决定了参数的大小。今天咱们就以数据库连接数参数为例说明怎么去设计参数。原创 2024-03-08 17:13:41 · 1441 阅读 · 0 评论 -
98. 一台服务器能支持多少QPS
这是因为,当我们在设计和部署一个应用程序的时候,我们需要确保它能够处理足够的流量,以满足用户的需求。首先,我们需要了解一下一台服务器的处理能力是如何衡量的。通常,我们会将服务器的处理能力表现为其每秒钟能够处理的事务数量。,这与我们监控显示的是差不多的。因此知道了,工作中这个例子是业务逻辑复杂很多,每次请求的平均耗时为。之后,我们可以通过简单的计算来计算一台服务器能够支持的。其中,每秒钟可以执行的操作,应该通过压测评估。,这个估计是非常简单的业务逻辑了,毕竟。,而我们要估计的是一台实例能承接的。原创 2024-03-08 16:31:34 · 1569 阅读 · 0 评论 -
97. 常用的HTTP服务压测工具
同时了解了程序的实际处理能力能够帮我们更好的匹配项目的实际需求(服务器实例个数,如需要部署。在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏。地址进行访问,可以得到每秒传送字节数、每秒处理请求数、每请求处理时间等统计数据。自带的性能测试工具。使用这个工具,只须指定同时连接数、请求数以及。同学可以使用它来测试,使用如下命令来安装。,即可测试网站或网站程序的性能。脚本来支持更加复杂的测试场景。性能测试工具,它和上面提到的。的机器),节约资源成本。原创 2024-03-08 16:02:05 · 1479 阅读 · 0 评论 -
96.Go设计优雅的错误处理(带堆栈信息)
本文想继续写一篇,可以作为工具包直接使用。也是记录一种新的思路和编码技巧,同时创建错误的时候会自动打印日志,还能提供堆栈信息。在之前的两篇文章中,我们已经介绍过错误的一些优雅处理。原创 2024-03-05 23:08:14 · 586 阅读 · 0 评论 -
95. Go中runtime.Caller的使用
返回调用Caller的函数A的pc(program counter)(A即runtime.Caller代码当前所在函数)、所在文件名以及Caller在函数A中的行数。: 返回调用函数A的函数B的pc、所在文件名以及函数A在函数B中的行数;: 程序计数器,指向下一条将要取指的指令地址。: 被调用方在pc对应的函数中的行数。: pc对应的函数所在文件路径。原创 2024-03-05 20:35:14 · 541 阅读 · 0 评论 -
94. 7张图掌握后端服务重构技巧
重构是项目发展中不可避免的一环。首先明确重构的目标并集中解决关键问题,其次确保在重构过程中维持“功能一致性”和“数据一致性”。这样做可以使整个重构过程更加流畅,并确保重构带来的收益远大于其成本。原创 2024-03-04 20:41:23 · 377 阅读 · 0 评论 -
93. 通用防重幂等设计
举例来说,一个更新用户信息的操作,如果是幂等的,那么多次执行相同的更新操作不会产生副作用,用户信息也不会发生额外的改变。因此,防止重复处理的一个常见策略是将更新用户信息的操作设计成幂等的,这样即使多次收到相同的更新请求,也不会对用户信息产生重复的更新。防重是指在多次提交同样的请求过程中,系统会检测和消除重复的数据,确保相同的数据只会被处理一次,从而避免不必要的重复操作或产生错误的结果。如果出错,要么是非法操作,要么是已被更新,要么是状态不对,总之多次调用是不会有副作用的。同时,记录已处理的请求标识。原创 2024-03-04 20:14:47 · 1004 阅读 · 0 评论 -
92.使用数组形式的责任链模式实现项目配置初始化
Golang中,可以使用接口(interface)来实现一种配置模式,其中配置对象实现一个接口,并提供一个Apply()方法来应用配置。这样,可以使用不同的配置对象来配置不同的行为,而不需要修改原始代码.原创 2024-02-07 17:18:38 · 1104 阅读 · 0 评论 -
91. Go实现一个最简单的带过期机制的KV存储:time.AfterFunc妙用
我们这里只是实现了一个非常简单的定时器,复杂场景下,考虑过期机制还需要考虑很多其他策略,比如。他有两个参数,一个是时间,多久后执行,一个是执行的方法。要带过期机制,自然想到的就是计时器。里面的过期机制,比这复杂多了。你的定时器可能会出现并发使用。方法,可以实现延迟执行。,因为它不是线程安全的。,肯定不能使用原生的。的情况,产生竞争引发。原创 2024-02-07 16:39:36 · 405 阅读 · 0 评论 -
90.Go语言中实现可选参数的几种方法:可变长参数、使用Map、结构体和函数选项模式
这篇博文介绍了在Go可变长参数、使用Map、结构体和函数选项模式。每种方法都有其适用场景和优缺点,你可以根据自己的需要选择合适的方法。原创 2024-02-07 16:28:51 · 2155 阅读 · 0 评论 -
89.Go使用channel优雅的收集多协程的结果
假如有这样一个场景,我们需要对一批用户中的每个用户执行某个操作,比如获取用户当月积分,需要所有用户都执行成功才算成功,有一个执行失败就应该整体返回错误(有点类似事务了,但实际场景不太一样,事务是多个操作要么都成功,要么都失败,而我这里例举的操作,是对同一批主体执行同一个操作)在日常工作中,使用协程提高处理效率是非常常见的技巧,这时候我们需要同时执行多个协程,然后再根据其结果再进行处理,这时候收集多个协程的值就非常关键。等待所有工作者完成,关闭通道,然后从通道中读取和处理结果。执行工作,并往一个通道。原创 2024-02-07 15:34:31 · 564 阅读 · 0 评论 -
88.Go设计优雅的错误处理
Go的错误处理和其他语言不太一样,如果遵守错误处理的规范,不对错误进行隐藏,写出来的代码一般都是比较健壮的。于是就难免会出现一个包里面,特别多的错误处理代码,这就是时间和空间的博弈,就看Go语言的领路人如何取舍了。其次每个人对错误的理解和处理思路方式都不太一样。就比如:我们到底是该多使用哨兵错误,还是该少用呢?但是最通用的还是哨兵错误以及自定义结构体作为错误。原创 2024-02-07 14:29:04 · 1595 阅读 · 0 评论 -
87.Go Redis实现可重入、自动续期分布式锁
在中我们介绍了分布式锁的原理、"坑"以及解决办法。原创 2024-02-06 16:38:17 · 1221 阅读 · 1 评论 -
86.分布式锁理论分析
高并发业务场景下,部署在不同机器上的业务进程,如果需要同时操作共享资源,为了避免「时序性」问题,通常会借助Redis的分布式锁来做互斥,以保证业务的正确性。基于Redis实现的分布式锁虽然足够简单,但这把小小的分布锁究竟安全吗?有没有可能会失效?基于Redis如何实现一个分布式锁?它足够安全吗?一个严谨的分布式锁模型如何实现,应该考虑什么?我们经常听到的Redlock有什么问题?业界争论Redlock,到底在争论什么?哪种观点是对的?分布式锁到底用Redis还是ZooKeeperEtcd。原创 2024-02-06 15:37:37 · 919 阅读 · 0 评论 -
85.如何设计高并发系统(缓存、限流、熔断、降级)
高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。高并发背景互联网行业迅速发展,用户量剧增,系统面临巨大的并发请求压力。高并发对系统的挑战性能下降、资源竞争和稳定性问题等。高并发是指系统或应用程序在同一时间段内接收到大量并发请求的能力。具体来说,高并发环境下系统需要能够同时处理大量的请求,而不会出现性能问题或响应延迟。原创 2024-02-04 16:58:11 · 1788 阅读 · 2 评论 -
84.如何设计高性能系统
互联网时代,业务系统的主要特点是用户多、请求量大。尤其在中国这样拥有庞大用户基数的环境下,不用说阿里巴巴、京东这类需要满足双十一大促时每秒几万甚至几十万订单的系统,即使是一些垂直领域的业务系统(如三甲医院的挂号系统)每天也有不小的访问量。在这样的背景下,设计能够承受高并发负载的高性能系统显得尤为重要。本文将从系统性能评估、影响系统性能的主要因素,以及一些具体的设计模式等方面介绍如何设计高性能系统。原创 2024-02-02 14:45:39 · 939 阅读 · 0 评论 -
83.如何设计高可用系统
什么是高可用高可用是指系统在面对各种故障和异常情况时,仍能够提供稳定、可靠的服务。对于企业和用户而言,高可用性是确保业务连续运行和用户体验的关键因素。高可用系统能够降低因故障而导致的损失,提高用户满意度。高可用与微服务架构微服务天生具有分布式特性,有利于构建高可用系统。通过微服务的自治性,可以实现部分服务的故障隔离,提高整体系统的可用性。本文主要介绍,在微服务架构下,如何设计高可用的业务系统。原创 2024-02-02 11:45:54 · 951 阅读 · 0 评论 -
82.1W/S的QPS到底大不大?
对于一般的个人网站或者中小型网站来说,是相当高的。,我们这就可以想象对于像腾讯、字节这种超大型互联网企业来说,他们的存储成本就是一个很大的开支。这也是为什么他们那么注重基础,对于这种企业,在设计数据库之初,表结构设计就需要考虑存储成本。其实是不能满足的,所以有的时候需要借助于其他大数据存储引擎来进行海量数据的存储。字段,那么每行数据的大小就需要根据实际插入的数据来进行计算了。对于一般企业来说是非常巨大的量,一天的存储大小可以到达。当然对于这种类似的企业,他们还有很多优化手段,像普通的。多项技术来进行优化。原创 2024-02-01 21:24:17 · 687 阅读 · 0 评论