架构精进之路

其他

如何防范 Token 遭遇伪造、篡改与窃取?—— 安全性问题全解析

引言随着IT和互联网的发展,从国家到企业,网络安全成为数字经济安全的重要内容,是一项每天、长期都要面对的问题。稍大一点的公司每年也都会有护网行动。随着技术的发展,Token的安全性已成为一个至关重要的议题,Token不仅被广泛用于用户身份验证,还承担着会话管理等关键任务。本文我们就来聊一聊防范伪造、篡改、窃取问题的解决方案。JWT提到token,就不得不提到JWT。什么是JWT❝Json
8月30日 下午 12:15
其他

如果面试官询问微服务架构设计,该如何作答?

为什么要做微服务?微服务一直是近几年的技术热点,凡是谈到架构设计,毫无疑问都离不开微服务这个话题。无论是做架构设计,还是只是做业务开发,几乎在所有的面试中,微服务设计几乎是必问的一道面试题。另外,在我们的实际工作中,几乎百分之80的公司,微服务也都是架构演变升级的方向。那么,为什么要做微服务呢?微服务的出发点是什么呢?单体架构达到瓶颈业务复杂度上升,扩展困难,维护费力度上升,牵一发动全身团队规模扩大,开发冲突增多,开发效率降低,无法兼容多种编程语言性能受到制约,在服务可靠性、吞吐能力、服务部署等方面达到瓶颈优化架构,更新换代保证技术架构的鲜活度,不与主流脱轨不断的调整技术建设,支撑内部技术发展更好的架构体系,更有力的支撑业务需求跟随潮流,为了微服务而微服务为了紧跟潮流,别人搞我们也要搞为了体验下微服务架构的魅力为了自己实操一把,掌握微服务技术微服务的出发点必定是为了解决架构层面遇到的问题,微服务是分而治之的思想。它通过引入更分散的架构思想,从而来解决更复杂的系统问题。所以,微服务并不是所有系统都适用的。在考虑微服务架构的时候,我们得先评估下是否真的需要?从单体到微服务是一个复杂化的过程,如果非必要不微服务。最近,大有微服务合并转向单体的趋势。只有我们的系统在业务复杂度层面、系统性能层面、团队开发协作层面等有了确切的需求,那么微服务确实是不二之选。微服务到底是什么?微服务(Microservices)是一种软件开发架构风格,它将一个复杂的应用程序构建为一系列小型服务的集合,每个服务运行在其独立的进程中,并通常围绕特定的业务能力进行构建。这些服务可以通过定义良好的API进行通信,通常是HTTP
8月23日 上午 8:31
其他

疑问:加密后的数据如何进行模糊查询?

我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。一、背景为了数据安全我们在开发过程中经常会对重要的数据进行加密存储,常见的有:密码、手机号、电话号码、详细地址、银行卡号、信用卡验证码等信息,这些信息对加解密的要求也不一样,比如说密码我们需要加密存储,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用时间换安全性)。在检索时我们既不需要解密也不需要模糊查找,直接使用密文完全匹配,但是手机号就不能这样做,因为手机号我们要查看原信息,并且对手机号还需要支持模糊查找,因此我们今天就针对可逆加解密的数据支持模糊查询来看看有哪些实现方式。在网上随便搜索了一下,关于《加密后的模糊查询》
8月7日 上午 8:30
其他

Redis 架构详解,值得收藏!

快照并将其发送到副本。在此传输之间,主实例会缓冲快照截止和当前偏移之间的所有中间更新指令,这样在快照同步完后,再将这些指令发送到副本实例。这样完成后,复制就可以正常继续。如果一个实例具有相同的复制
7月31日 上午 8:30
其他

聊聊 Redis 的高可用

核心全面总结服务接口优化的常见方案实战总结聊聊分布式服务下的八种异步实现方式有没有那么一瞬间,你也曾有过“失业焦虑”?浅析分布式系统中的补偿机制设计问题聊聊分布式日志系统的设计与实践执行个
7月25日 上午 8:30
其他

经典面试题:Redis为什么这么快?

Redis有多快根据官方基准测试,在具有平均硬件的Linux机器上运行的单个Redis实例通常可以为简单命令(O(N)或O(log(N)))实现8w+的QPS,使用流水线批处理可以达到100w。从性能角度来看,Redis可以称为高性能的缓存解决方案。Redis为什么这么快面试时经常被问到Redis高性能的原因,典型回答是下面这些:C语言实现,虽然C语言有助于Redis的性能,但语言并不是核心因素。基于内存实现:仅内存I/O,相对于其他基于磁盘的数据库(MySQL等),Redis具有纯内存操作的自然性能优势。I/O复用模型,基于epoll/select/kqueue等I/O多路复用技术实现高吞吐量网络I/O。单线程模型,单线程无法充分利用多核,但另一方面,它避免了多线程的频繁上下文切换以及锁等同步机制的开销。为什么Redis选择单线程?上面回答了是单线程的,接着会问为啥采用单线程模型。Redis的CPU通常不会成为性能瓶颈,因为通常情况下Redis要么受到内存限制,要么受到网络限制。例如,使用流水线技术,在平均Linux系统上运行的Redis甚至可以每秒处理100万个请求,因此,如果应用程序主要使用O(N)或O(log(N))命令,它几乎不会使用太多CPU。这基本上意味着CPU通常不是数据库的瓶颈,因为大多数请求不会占用太多CPU资源,而是占用I/O资源。特别是对于Redis来说,如果不考虑像RDB/AOF这样的持久性方案,Redis是完全的内存操作,非常快速。Redis的真正性能瓶颈是网络I/O,即客户端和服务器之间的网络传输延迟,因此Redis选择了单线程的I/O多路复用来实现其核心网络模型。「实际上选择单线程的更具体原因可以总结如下:」避免过多的上下文切换开销:在多线程调度过程中,需要在CPU之间切换线程上下文,并且上下文切换涉及一系列寄存器替换、程序堆栈重置,甚至包括程序计数器、堆栈指针和程序状态字等快速表项的退休。因为单个进程内的多个线程共享进程地址空间,线程上下文要比进程上下文小得多,在跨进程调度的情况下,需要切换整个进程地址空间。避免同步机制的开销:如果Redis选择多线程模型,因为Redis是一个数据库,不可避免地涉及底层数据同步问题,这必然会引入一些同步机制,如锁。我们知道Redis不仅提供简单的键值数据结构,还提供列表、集合、哈希等丰富的数据结构。不同的数据结构对于同步访问的锁定具有不同的粒度,这可能会在数据操作期间引入大量的锁定和解锁开销,增加了程序的复杂性并降低了性能。简单和可维护性:Redis的作者Salvatore
7月24日 上午 8:30
其他

一文帮你梳理,高可用架构流量治理核心策略

hello,大家好,我是张张,「架构精进之路」公号作者。对于人类的身体健康来说,“三高”是个大忌,但在计算机界,系统的“三高”却是健康的终极目标。本文将介绍一下流量治理是如何维持这种“三高”系统的健康,保障数据流动的均衡与效率,就如同营养顾问在维持人类健康饮食中所起的作用一般。分享概要一、可用性的定义二、流量治理的目的三、流量治理的手段四、总结一、可用性的定义在探讨高可用架构之前,让我们以
7月9日 上午 8:30
其他

如何正确使用上线部署,泳道、预发布到底如何理解?

hello,大家好,我是张张,「架构精进之路」公号作者。一、背景如今互联网,随着业务需求迭代快速,同一个服务可能存在多个同时开发和测试的功能,容易发生资源抢占分支互相冲突影响的问题,降低开发测试效率。同时微服务架构下,一个功能可能需要依赖多个服务。在测试其中一个服务的改动时,如果依赖的服务发生了改动或者故障,也会影响这个功能的测试。......以上种种问题情况,都会导致服务从测试到线上正式环境的环境差异性较大。规范上线部署流程,通过对环境的隔离来剥离耦合型风险,便于问题暴露及快速解决。二、预发布环境2.1
7月3日 上午 8:31
其他

揭秘打车软件,如何找到方圆 1km 以内的乘客

hello,大家好,我是张张,「架构精进之路」公号作者。背景不知道大家是否思考过一个问题,在一些场景下(如大家在使用高德地图打车的时候,邻近的司机是如何知道你在他的附近并将你的打车通知推送给他去接单的?)是如何实现的?一般来讲,大家也许会想到,首先肯定需要知道每位乘客的经纬度(lng,lat),也即是二维坐标(当然这是在绝对理想的情况,不考虑上下坡度)。而在知道了经纬度之后,一个暴力简单且容易想到的思路就是将经纬度这个「二元组」
6月21日 上午 8:31
其他

学习优秀开源框架,打造牛逼程序员

hello,大家好,我是张张,「架构精进之路」公号作者。在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。经过整理,大概有以下设计模式,如图1所示。类型:创建型模式▊
6月6日 上午 8:30
其他

全面透彻,MySQL 正确的慢查询处理姿势

hello,大家好,我是张张,「架构精进之路」公号作者。发现的一些问题问题1在过去的半年时间里,研发团队内部尝试抓了一波儿慢查询SQL跟进处理率。发现有些同学对于慢查询处理的思路就是看看有没有用到索引,没有用到就试图加一个,实在不行就甩锅给这种情况是历史设计问题或者自行判定为用户特殊操作下触发的小概率事件,随即便申请豁免掉...
5月28日 上午 8:30
其他

全面透彻,深刻理解 MySQL 索引

平衡的意思),是一种自平衡的树,能够保持数据有序,B-树允许每个节点有更多的子节点。如图所示:B-树不利于范围查找,范围查找也是我们经常用到的,所以B-树也不太适合在磁盘中存储需要检索的数据。2.4
5月21日 上午 8:30
其他

一张图看懂微服务架构路线

hello,大家好,我是张张,「架构精进之路」公号作者。我为什么选择微服务架构?众所周知,单体应用程序,由于其种种不足,几乎不支持敏捷方法。如果你想为一个大型或复杂的业务创建一个软件项目,最好从微服务架构开始。微服务架构是一种灵活的架构,可以显著性地提高应用程序灵活性、可扩展性等。微服务架构路线据我了解很多开发者,想知道他们应该如何开始微服务架构旅程,虽然有成千上万的资源可以使用,但是资源到处分散。我决定通过为微服务架构学习定义路线图,使这段旅程更加清晰。基本思路基于微服务的架构通常有几个独立的单元,它们协同工作以接收和处理各种请求。这个复杂的某些部分可以是插件,这意味着在需要的情况下,你可以在不干扰应用程序的整体工作情况下,
5月7日 上午 8:30
自由知乎 自由微博
其他

系统设计中 跨时区问题 解决方案

hello,大家好,我是张张,「架构精进之路」公号作者。一、背景假如开发一套统一的系统产品,供遍布全球的所有分公司使用。产品功能设计中,经常会遇到一场活动,分跨不同时区,系统需要显示不同时区的时间,同时希望跨时区的用户可以同一时间开始,同一时间结束。对于类似跨时区处理问题,那我们该如何设计实现呢?二、几个重要概念时区
4月29日 上午 8:30
其他

解析微服务架构中10个重要的设计模式

消费端驱动的契约测试在微服务架构中,通常有许多有不同团队开发的微服务。这些微型服务协同工作来满足业务需求(例如,客户请求),并相互进行同步或异步通信。消费端微服务的集成测试具有挑战性,通常用
4月16日 上午 8:30
其他

为女儿奴程序员打造的“小可爱”

开发平台,用户只需要配置逻辑即可调用大模型来进行处理逻辑,相当于把大模型作为通用的组件,对非编码人士非常友好。本次简单实现了一个角色AI机器人,并未应用更丰富的记忆库能力,简单高效,扩展性非常强。
2月29日 上午 8:31
其他

RabbitMQ vs Kafka,我到底该如何选?

部分文章地址:https://betterprogramming.pub/rabbitmq-vs-kafka-1779b5b70c41值得注意的是,无论消费者是否消费了这些消息,Kafka
1月25日 上午 8:31
其他

Redis 实现多规则限流的思考与实践

hello,大家好,我是张张,「架构精进之路」公号作者。简介市面上很多介绍redis如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如1分钟访问1次或者60分钟访问10次这种,但是如果想一个接口两种规则都需要满足呢,我们的项目又是分布式项目,应该如何解决,下面就介绍一下redis实现分布式多规则限流的方式。思考如何一分钟只能发送一次验证码,一小时只能发送10次验证码等等多种规则的限流如何防止接口被恶意打击(短时间内大量请求)如何限制接口规定时间内访问次数解决方法记录某IP访问次数使用
1月3日 上午 8:30
其他

从一笔交易充值,考虑到分布式事务处理

hello,大家好,我是张张,「架构精进之路」公号作者。文章纲要此次分享的缘由目前分布式事务问题是怎么解决的行业中有什么解决方案这些解决方案分别有什么优缺点别人是怎么做的我们可以怎么来做此次分享的缘由支付重构考虑支付重构的时候,自然想到原本属于一个本地事务中的处理,现在要跨应用了要怎么处理。拿充值订单举个栗子吧,假设:原本订单模块和账户模块是放在一起的,现在需要做服务拆分,拆分成订单服务,账户服务。原本收到充值回调后,可以将修改订单状态和增加金币放在一个mysql事务中完成的,但是呢,因为服务拆分了,就面临着需要协调2个服务才能完成这个事务。所以就带出来,我们今天要分享和讨论的话题是:怎么解决分布式场景下数据一致性问题,暂且用分布式事务来定义吧。同样的问题还存在于其他的场景:送礼:1.
2023年12月7日
其他

MySQL查询,是 join性能好,还是in一下更快呢?

hello,大家好,我是张张,「架构精进之路」公号作者。一、表结构1、用户表2、订单表二、先来试少量数据的情况1、join2、分开查3、代码层面三、试下多一些数据的情况1、join2、分开3、代码层面三、试下多一些数据的情况1、join2、分开3、代码层面四、到底怎么才能更好参考资料先总结:数据量小的时候,用join更划算数据量大的时候,join的成本更高,但相对来说join的速度会更快数据量过大的时候,in的数据量过多,会有无法执行SQL的问题,待解决事情是这样的,在一次代码review的时候有同学提出说,不要写join,join耗性能还是慢来着,当时也是真的没有多想,那就写in好了,最近发现in的数据量过大的时候会导致sql慢,甚至sql太长,直接报错了。这次来浅究一下,到底是in好还是join好,仅目前认知探寻,有不对之处欢迎指正以下实验仅在本机电脑试验。一、表结构1、用户表图片
2023年12月1日
其他

SQL性能优化详解,值得收藏

key,那么该字段默认就是主键索引。主键索引和唯一索引非常相似。相同点:该列中的数据都不能有相同值;不同点:主键索引不能有null值,但是唯一索引可以有null值。3)索引删除和索引查询①
2023年11月15日
其他

批量写库操作,如何优化?

核心全面总结服务接口优化的常见方案实战总结聊聊分布式服务下的八种异步实现方式有没有那么一瞬间,你也曾有过“失业焦虑”?浅析分布式系统中的补偿机制设计问题聊聊分布式日志系统的设计与实践执行个
2023年11月3日
其他

MySQL与MongoDB,该如何做技术选型?

hello,大家好,我是张张,「架构精进之路」公号作者。引言一般情况下,会考虑到MySQL与MongoDB如何做技术选型的时候,你一定是遇到了类似于非结构化数据JSON的存取难题,否则大家都直接MySQL开始搞起了。为什么要关注MongoDB呢?下图是DB-Engines
2023年10月31日
其他

应该如何正确理解BFF架构设计?

核心全面总结服务接口优化的常见方案实战总结聊聊分布式服务下的八种异步实现方式有没有那么一瞬间,你也曾有过“失业焦虑”?浅析分布式系统中的补偿机制设计问题聊聊分布式日志系统的设计与实践执行个
2023年10月27日
其他

数据库分库分表方案,总结的非常好!

hello,大家好,我是张张,「架构精进之路」公号作者。一、数据切分介绍关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。数据库分布式核心内容就是数据切分(Sharding),以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分。1、垂直(纵向)切分垂直切分常见有垂直分库和垂直分表两种。垂直分库:根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图:垂直分表:是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能。1)优点解决业务系统层面的耦合,业务清晰与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈2)缺点部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度分布式事务处理复杂依然存在单表数据量过大的问题(需要水平切分)2、水平(横向)切分当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平切分了。水平切分分为库内分表和分库分表,是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果。库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决:1)优点不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力应用端改造较小,不需要拆分业务模块2)缺点跨分片的事务一致性难以保证跨库的join关联查询性能较差数据多次扩展难度和维护量极大水平切分后同一张表会出现在多个数据库/表中,每个库/表的内容不同。几种典型的数据分片规则为:1)根据数值范围按照时间区间或ID区间来切分。例如:按日期将不同月甚至是日的数据分散到不同的库中;将userId为1~9999的记录分到第一个库,10000~20000的分到第二个库,以此类推。某种意义上,某些系统中使用的"冷热数据分离",将一些使用较少的历史数据迁移到其他库中,业务功能上只提供热点数据的查询,也是类似的实践。①优点单表大小可控天然便于水平扩展,后期如果想对整个分片集群扩容时,只需要添加节点即可,无需对其他分片的数据进行迁移使用分片字段进行范围查找时,连续分片可快速定位分片进行快速查询,有效避免跨分片查询的问题②缺点热点数据成为性能瓶颈。连续分片可能存在数据热点,例如按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询。2)根据数值取模一般采用hash取模mod的切分方式,例如:将
2023年10月8日
其他

合适的网络流量管理组件,API 网关 vs 负载均衡 究竟该如何抉择?

hello,大家好,我是张张,「架构精进之路」公号作者。由于互联网技术的发展,网络数据的请求数节节攀升,这使得服务器承受的压力越来越大。在早期的系统架构中,通常使用负载均衡来将网络流量平摊到多个服务器中,以此减轻单台服务器的压力。但是现如今,后端服务的种类在不断地变多,每个种类的后端都以
2023年8月23日
其他

架构师必知必会,聊聊后端架构设计的演进

hello,大家好,我是张张,「架构精进之路」公号作者。你想成为一名架构师,对吗?别对我撒谎,我知道你想成为架构师。即使你不想,你还是想成为一名更好的开发者。否则,你就不会花时间阅读这篇文章😁相信每一位程序员都有一颗成为架构师的心。毕竟,我们都希望在自己所从事的领域变得更好,即使不能称为最好。程序员的成长绕不开架构设计,有时架构设计就像鸿沟一样挡在程序员晋升之路上,只要跨过去就可以海阔天空。那么,你如何成为一名架构师呢?前提当然是通过学习了解所有的架构!显然这不现实。你不需要知道所有的架构,你也不需要对所有的架构都有经验。但是,至少了解最流行的几种架构,比如
2023年8月16日
其他

一个高流量高并发系统,设计关注点有哪些

hello,大家好,我是张张,「架构精进之路」公号作者。相信每一位开发同学多多少少都想参与或负责一个高用户、高访问、高并发的系统吧。一来可以增加自己实际的项目经验,有应对高并发场景的解决方案,二来是有个高并发的项目经验无疑是自己简历的一个大大的加分项。但是奈何很多人都没有机会可以参与这样的项目,本文从以下几点介绍一下设计一个高流量高并发的系统需要经历哪些步骤以及考虑哪些因素(文章中的不足之处还请大佬们多多指点)。高流量高并发系统关注点1、设计原则1.1、系统设计原则1.2、业务设计原则2、客户端优化3、使用CDN4、服务的集群5、服务端缓存6、数据库优化7、服务治理总结1、设计原则1.1、系统设计原则在设计一个系统之前,我们先要有一个统一且清晰的认知:不要想着一下就能设计出完美的系统,好的系统是迭代出来的。不要复杂化,要先解决核心问题。但是要有先行的规划,对现有的问题有方案,对未来系统有预案。在设计高并发的系统时要遵循以下几个原则:无状态原则什么是无状态?服务器不保存状态,对单次请求的处理不依赖别的请求就是无状态,主要是为了在应对高并发时方便水平扩展。拆分原则在我们的系统体积过于庞大或者承载不了大量的请求时,就要考虑拆分系统,将复杂问题简单化或将流量分散不同子系统分担压力。可以按照以下几个维度进行拆分:系统维度:
2023年7月26日
其他

ChatGPT:向未来迈进的智能对话伴侣

除了可以提供答疑解惑、学习资源和指导之外,还可以作为娱乐和休闲的伴侣。它能够与用户进行有趣的对话,提供娱乐活动和休闲娱乐,用户可以与ChatGPT进行游戏、讨论感兴趣的话题或者仅仅进行闲聊。基于
2023年7月16日
其他

私藏多年的系统性能优化十大绝招(万字干货)

hello,大家好,我是张张,「架构精进之路」公号作者。阅读提醒→:本文内容较干,且篇幅较长,感谢打开,剩下的只管交给收藏夹。上篇引言:取与舍软件设计开发某种意义上是“取”与“舍”的艺术。关于性能方面,就像建筑设计成抗震9度需要额外的成本一样,高性能软件系统也意味着更高的实现成本,有时候与其他质量属性甚至会冲突,比如安全性、可扩展性、可观测性等等。大部分时候我们需要的是:在业务遇到瓶颈之前,利用常见的技术手段将系统优化到预期水平。那么,性能优化有哪些技术方向和手段呢?性能优化通常是“时间”与“空间”的互换与取舍。本篇分两个部分,在上篇,讲解六种通用的“时间”与“空间”互换取舍的手段:索引术压缩术缓存术预取术削峰填谷术批量处理术在下篇,介绍四种进阶性的内容,大多与提升并行能力有关:八门遁甲
2023年7月5日
其他

面对复杂业务系统,通用架构设计法则

端的商家入驻、管理等体系。各个部分、体系之间有着千丝万缕的联系,可谓之复杂系统了。当然了,远远不止这些,随着业务复杂性的不断提升,整个系统的复杂性也会愈来愈复杂。二、什么是架构生活中我们经常谈及
2023年6月20日
其他

高可用高性能核心原理探究,Kafka 核心全面总结

参数值提升吞吐。但是,需要注意的是,如果批量发送的大小设置得过大,可能会导致消息发送的延迟增加,因此需要根据实际情况进行调整。linger.ms:控制消息在批量发送前的等待时间,默认值为
2023年6月16日
其他

聊聊分布式服务下的八种异步实现方式

hello,大家好,我是张张,「架构精进之路」公号作者。前言:异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:「发送短信、邮件、异步更新等」,这些都是典型的可以通过异步实现的场景。一、异步的八种实现方式1、线程Thread2、Future3、异步框架CompletableFuture4、Spring注解@Async5、Spring
2023年5月24日
其他

致那些35岁-45岁的伪“中年人”

hello,大家好,我是张张,「架构精进之路」公号作者。中年人是几岁到几岁?今天特意百度了下:“中年人是几岁到几岁?”给出的答案是:“45周岁到59周岁”说实话,有点儿出乎我的意料,40岁还不算是中年人嘛,造成这种错觉的原因,也许是周围被充斥了太多“35岁职场危机”的消息。
2023年5月19日
其他

聊聊微服务架构下网关的技术选型

高可用因为所有的流量或调用经过网关,所以网关必须成为一个高可用的技术组件,它的稳定直接关系到了所有服务的稳定。网关如果没有设计,就会成变一个单点故障。因此,一个好的网关至少要做到以下几点。集群化
2023年5月17日
其他

一文一图,搞懂微服务架构路线图

hello,大家好,我是张张,「架构精进之路」公号作者。我为什么选择微服务架构?众所周知,单体应用程序,由于其种种不足,几乎不支持敏捷方法。如果你想为一个大型或复杂的业务创建一个软件项目,最好从微服务架构开始。微服务架构是一种灵活的架构,可以显著性地提高应用程序灵活性、可扩展性等。微服务架构路线据我了解很多开发者,想知道他们应该如何开始微服务架构旅程,虽然有成千上万的资源可以使用,但是资源到处分散。我决定通过为微服务架构学习定义路线图,使这段旅程更加清晰。基本思路基于微服务的架构通常有几个独立的单元,它们协同工作以接收和处理各种请求。这个复杂的某些部分可以是插件,这意味着在需要的情况下,你可以在不干扰应用程序的整体工作情况下,
2023年5月6日
其他

浅析分布式系统中的补偿机制设计问题

hello,大家好,我是张张,「架构精进之路」公号作者。在分布式系统越来越普及的今天,补偿机制是程序员在学习分布式开发的时候需要重点掌握的一个编程开发方法,而今天我们就一起来聊聊,补偿机制的应用表现都有哪些实现方法。文章目录一、关于业务补偿机制1、什么是业务补偿2、业务补偿设计的实现方式二、关于回滚1、显示回滚2、回滚的实现方式三、关于重试1、重试的使用场景2、重试策略3、重试时的注意事项四、业务补偿机制的注意事项1、ACID
2023年5月5日
其他

聊聊分布式日志系统的设计与实践

hello,大家好,我是张张,「架构精进之路」公号作者。1、什么是日志日志是一种按照时间顺序存储记录的数据,它记录了什么时间发生了什么事情,提供精确的系统记录,根据日志信息可以定位到错误详情和根源。按照APM概念的定义,日志的特点是描述一些离散的(不连续的)事件。由于日志本身固有的特性,记录从左向右开始顺序插入,也就意味着左边的记录相较于右边的记录“更老”,
2023年4月29日
其他

服务接口优化的常见方案实战总结

hello,大家好,我是张张,「架构精进之路」公号作者。一、背景针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。图片二、接口优化方案总结1.批处理批量思想:批量操作数据库,这个很好理解,我们在循环插入场景的接口中,可以在批处理执行完成后一次性插入或更新数据库,避免多次IO。//批量入库batchInsert();2.异步处理异步思想:针对耗时比较长且不是结果必须的逻辑,我们可以考虑放到异步执行,这样能降低接口耗时。例如一个理财的申购接口,入账和写入申购文件是同步执行的,因为是T+1交易,后面这两个逻辑其实不是结果必须的,我们并不需要关注它的实时结果,所以我们考虑把入账和写入申购文件改为异步处理。如图所示:图片至于异步的实现方式,可以用线程池,也可以用消息队列,还可以用一些调度任务框架。3.空间换时间一个很好理解的空间换时间的例子是合理使用缓存,针对一些频繁使用且不频繁变更的数据,可以提前缓存起来,需要时直接查缓存,避免频繁地查询数据库或者重复计算。需要注意的事,这里用了合理二字,因为空间换时间也是一把双刃剑,需要综合考虑你的使用场景,毕竟缓存带来的数据一致性问题也挺令人头疼。这里的缓存可以是R2M,也可以是本地缓存、memcached,或者Map。举一个股票工具的查询例子:因为策略轮动的调仓信息,每周只更新一次,所以原来的调接口就去查库的逻辑并不合理,而且拿到调仓信息后,需要经过复杂计算,最终得出回测收益和跑赢沪深指数这些我们想要的结果。如果我们把查库操作和计算结果放入缓存,可以节省很多的执行时间。如图:图片4.预处理也就是预取思想,就是提前要把查询的数据,提前计算好,放入缓存或者表中的某个字段,用的时候会大幅提高接口性能。跟上面那个例子很像,但是关注点不同。举个简单的例子:理财产品,会有根据净值计算年化收益率的数据展示需求,利用净值去套用年化收益率计算公式计算的逻辑我们可以采用预处理,这样每一次接口调用直接取对应字段就可以了。5.池化思想我们都用过数据库连接池,线程池等,这就是池思想的体现,它们解决的问题就是避免重复创建对象或创建连接,可以重复利用,避免不必要的损耗,毕竟创建销毁也会占用时间。池化思想包含但并不局限于以上两种,总的来说池化思想的本质是预分配与循环使用,明白这个原理后,我们即使是在做一些业务场景的需求时,也可以利用起来。比如:对象池6.串行改并行串行就是,当前执行逻辑必须等上一个执行逻辑结束之后才执行,并行就是两个执行逻辑互不干扰,所以并行相对来说就比较节省时间,当然是建立在没有结果参数依赖的前提下。比如,理财的持仓信息展示接口,我们既需要查询用户的账户信息,也需要查询商品信息和banner位信息等等来渲染持仓页,如果是串行,基本上接口耗时就是累加的。如果是并行,接口耗时将大大降低。如图:图片7.索引加索引能大大提高数据查询效率,这个在接口设计之出也会考虑到,这里不再多赘述,随着需求的迭代,我们重点整理一下索引不生效的一些场景,希望对小伙伴们有所帮助。具体不生效场景不再一一举例,后面有时间的话,单独整理一下。图片8.避免大事务所谓大事务问题,就是运行时间较长的事务,由于事务一致不提交,会导致数据库连接被占用,影响到别的请求访问数据库,影响别的接口性能。举个例子:@Transactional(value
2023年4月28日
其他

有没有那么一瞬间,你也曾有过“失业焦虑”?

hello,大家好,我是张张,「架构精进之路」公号作者。每一次新技术潮流到来,都有人宣传它们会让“程序员”失业,比如云服务、低代码等等云原生、DevOps,催生了“运维该集体下岗”的看法生成式
2023年4月21日
其他

执行个 DEL 竟然也会阻塞 Redis?深挖一下果然不简单

的思想,你主动发起请求了,我就顺便帮你检查下当前状态,如果没有请求,那么我就不做任何处理。站在系统的角度,它需要客户端触发,然后系统被动的接受指令。此时,你可能会想:Redis
2023年3月31日
其他

PHP 中数组是如何灵活支持多数据类型的?

引用计数,垃圾回收使用。arData:散列表中保存存储元素的数组,其内存是连续的,arData指向数组的起始位置;nTableSize:数组的总容量,即可以容纳的元素数,arData
2023年3月24日
其他

一文带你看通透,MySQL事务ACID四大特性实现原理

lock:锁定区间范围,防止幻读,左开右开,只在可重复读隔离级别下生效—|—为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生记录锁-record
2023年3月11日
其他

通过alter table 来实现重建表,同事大呼开眼界了

hello,大家好,我是张张,「架构精进之路」公号作者。1、应用背景在日常工作开发中,在MySQL中,如果我们对大表频繁进行insert和delete操作,那么时间一长,这个表中会出现很多"空洞",也就是表碎片。碎片产生的原因是insert随机值作为主键id,会产生很多数据页分裂操作;而delete掉一些排列有序的主键值,这些被delete的空间不会直接释放,而是仅仅进行delete的标记,这些空间如果不能被利用,那就会变成"空洞"。2、重建表关于重建表,这时候新建一张结构一样的临时表,把表内的数据导入到临时表,直接删除旧表,然后将临时表替换为旧表,从而释放这些空余的空间,让数据变得"紧凑些",完成重建操作。我们其实可以通过如下命令来重建表:alter
2023年3月3日
其他

实习生疑问:为什么要在需要排序的字段上加索引呢?

hello,大家好,我是张张,「架构精进之路」公号作者。众所周知,为了避免全表扫描,条件句中增加了索引,性能上对比一目了然。组内实习生同学不禁疑问:为什么要在排序的字段上添加索引呢?排序有好多种算法来实现,在
2023年2月23日
其他

还傻傻分不清MySQL回表查询与索引覆盖?

hello,大家好,我是张张,「架构精进之路」公号作者。最近的工作中,遇到一个查询里用到主键索引与二级索引并存的问题情况,那对于这种情况,索引是如何高效执行的,是否会产生回表查询呢?等等,首先解释一下,什么是回表?回表定义:先索引扫描,再通过ID去取索引中未能提供的数据,即为回表。即先定位主键值,再定位行记录。1、两类索引为了更好地阐释这个问题,我们还是从索引来介绍吧。InnoDB
2023年2月20日
其他

一文看懂:近期不断 “狂飙” 的 ChatGPT

“在没有任何训练或强化的情况下,在所有三个考试中都达到或接近通过线”。与此同时,这款AI语言模型,也让撰写邮件、论文、脚本,制定商业提案,创作诗歌、故事都变得易如反掌。四、常见问题4.1
2023年2月10日
其他

澄清一个大多数程序员存在的认知误区

hello,大家好,我是张张,「架构精进之路」公号作者。一直以来,“大厂高薪”、“优秀程序员”、“平台生态”、“研发技能”、“跳槽稳定性”
2023年2月3日
其他

写在初七,回味下过年的意义

hello,大家好,我是张张,「架构精进之路」公号作者。今天大年初七,打工人开始正式上班的第一天,开启新一年搬砖的日子啦~好像一切都回到了正轨,好像这个特别的节日没有来过一样,心里有点儿空落落的。正所谓人只有在接近幸福的时候才是最幸福的,年前回家的路上和回家的那一刻,才是最值得回味的。1、关于过年凡是过往,皆为序章。眉目舒展,顺祝冬安。年其实还是那个年,生活还是原来的生活,家还是那个家,唯一让我们变好的是我们自己。过年,是对过去流年坎坷的感悟总结,也是新的一年美好期盼,也是告诉我们要对生活有所盼头。年是很多人的精神寄托,哪怕年味越来越淡,也无法动摇过年在大家心目中的地位。现在过年,过的是一种寄托,盼的是辛劳一年后的团聚。2、关于老家每到过年,每个人少不了的就是回老家。不管叫交通工具如何升级,回家的路还是那条路,但你我已历经沧桑。故乡,是你小时候拼命想逃离的地方,却是长大后,最想回去的地方。老家的风景,虽平淡无奇但很耐看;乡土人情,总是那么朴实无华。生活中有很多的美,而唯有老家的美,可以治愈一年的漂泊。人生无常,心安便是归处。不管游子出门多远去打拼,过节都会奔赴家乡,甚至年老也会叶落归根,都是对家的向往,给心灵寻找一份寄托。3、关于孩子回想自己还是小孩子的时候,最盼望的就是过年,也是童年中开心的时光。在过年的时候,其实也在潜移默化把这些传统习俗,传递给孩子。贴对联、放烟花,年夜饭、春节晚会、压岁钱、走亲访友等。生命的轮回,我们终将要回归孩子一样的心态,无忧无虑、天真无邪。4、关于未来又是一年,时间又一次停靠新年驿站,跟过去的一年告别,向未来的一年祈愿,感受岁月无情流逝,心中又升腾起新的希望。凡事要努力,但不一定要急于求成,因为播种和收获不在一个季节,中间隔着一段时间叫坚持,所有的硕果累累、繁花似锦,都需要时间去孕育。明知道人生无常、人生苦短、都会面临生老病死,但我们依然还是要热爱生活,还是要努力。因为多一份努力,就可给孩子多创造一点好的条件,为的就是这份生生不息,也是为的这份心安和无愧人生。阅尽人间沧桑,才会明白,家人闲坐,灯火可亲,才是我们最向往的生活!如果所有的困难,如果无法避免,那我们就迎难而上。人间烟火、粗茶淡饭、平平淡淡、才是真实的人生。最后,祝大家新年新气象!好好工作,好好生活!往期热文推荐:太强了,全面解析缓存应用经典问题如何把团队带成一盘散沙?MD5
2023年1月28日
其他

面对一堆烂代码,重构,还是重新开发?

hello,大家好,我是张张,「架构精进之路」公号作者。1、烂代码的形成写烂代码很容易,但代码写成一坨屎,还能正常运行,那就要有点水平才行。尤其是一些经验不足的新手,根本不在乎代码质量的重要性,也没啥扩展性的考量,直接出手就是干。可是几个月之后,他们似乎也没怎么踩坑,但随着业务的不断发展,吸引了更多的人加入到这个项目中来。语言越来越高级、封装越来越完善,各种技术都在帮助程序员提高生产代码的效率,依靠层层封装,程序员真的不需要了解一丁点技术细节,只要把需求里的内容逐行翻译出来就可以了。很多程序员不知道要怎么组织代码、怎么提升运行效率、底层是基于什么原理,他们写出来的是在我心目中烂成一坨屎一样的代码。但是那一坨屎一样代码竟然能正常工作。即使我认为他们写的代码是坨屎,但是从不接触代码的人的视角来看(比如说你的boss),代码编译过了,测试过了,上线运行了一个月都没出问题,你还想要奢求什么?所以,即使不情愿,也必须承认,别人写的代码能正常运行,且不出错,那就是牛x。2、烂代码终究是烂代码但是偶尔有那么几次,写烂代码的人离职了之后,事情似乎又变得不一样了。想要修改功能时却发现程序里充斥着各种无法理解的逻辑、改完之后莫名其妙的bug一个接一个,接手这个项目的人开始漫无目的的加班,并且原本一个挺乐观开朗的人渐渐的开始喜欢问候别人祖宗了。试问:针对烂代码就没有可解的方案了么?3、重构之道针对代码重构,有本经典的读本《重构:改善既有代码的设计》,非常全面的阐述了各种重构之术。而且各种编程范式,比如面向对象编程中的类的重构和函数式编程中的函数的重构也不尽相同;各种语言,比如
2023年1月13日