终究没有人在意一家民营企业的生死

去泰国看了一场“成人秀”,画面尴尬到让人窒息.....

网友建议:远离举报者李X夫!

【少儿禁】马建《亮出你的舌苔或空空荡荡》

10部适合女性看的唯美情色电影

自由微信安卓APP发布,立即下载! | 提交文章网址

架构师

TCP 为什么是三次握手,而不是两次或四次?

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享三次握手两次握手(情况1)两次握手(情况2)OK,下面正经地来回答下这个问题,要搞清楚这个问题,首先得了解TCP究竟是如何保证可靠传输的。PS:TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。第一次握手客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。PS1:SYN=1,ACK=0表示该报文段为连接请求报文。PS2:x为本次TCP通信的字节流的初始序号。TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。第二次握手服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。该应答发送完成后便进入SYN-RCVD状态。PS1:SYN=1,ACK=1表示该报文段为连接同意的应答报文。PS2:seq=y表示服务端作为发送者时,发送字节流的初始序号。PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。第三次握手当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1。客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!为什么连接建立需要三次握手,而不是两次握手?防止失效的连接请求报文段被服务端接收,从而产生错误。PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。TCP四次挥手TCP连接的释放一共需要四步,因此称为『四次挥手』。我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。第一次挥手若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。PS1:FIN=1表示该报文段是一个连接释放请求。PS2:seq=u,u-1是A向B发送的最后一个字节的序号。第二次挥手B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:ACK=1,seq=v,ack=u+1。PS1:ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。PS2:seq=v,v-1是B向A发送的最后一个字节的序号。PS3:ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。第三次挥手当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。第四次挥手A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。为什么
2022年6月11日

图解Kafka,触类旁通

分布可能就是这样的:感谢阅读,希望对你有所帮助!😃如喜欢本文,请点击右上角,把文章分享到朋友圈如有想了解学习的技术点,请留言给若飞安排分享·END·相关阅读:一张图看懂微服务架构路线基于Spring
2022年5月31日

有了HTTP,为什么还要RPC?

领域驱动的微服务?小团队真的适合引入SpringCloud微服务吗?DDD兴起的原因以及与微服务的关系微服务之间的最佳调用方式微服务架构设计总结实践基于
2022年5月30日

Kubernetes 架构核心点总结

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?目录:一个目标:容器操作两地三中心四层服务发现五种Pod共享资源六个CNI常用插件七层负载均衡八种隔离维度九个网络模型原则一个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,K8s有亿:亿级日服务人次。一个目标:容器操作Kubernetes(k8s)是自动化容器操作的开源平台。这些容器操作包括:部署、调度和节点集群间扩展。具体功能:自动化容器部署和复制。实时弹性收缩容器规模。容器编排成组,并提供容器间的负载均衡。调度:容器在哪个机器上运行。组成:kubectl:客户端命令行工具,作为整个系统的操作入口。kube-apiserver:以REST
2022年5月5日

kubernetes 架构及应用场景

间负载均衡如喜欢本文,请点击右上角,把文章分享到朋友圈如有想了解学习的技术点,请留言给若飞安排分享·END·相关阅读:kubernetes的架构与组件kubernetes面试题汇总浅谈
2022年4月29日

挑战大型系统的缓存设计——应对一致性问题

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?在真实的业务场景中,我们业务的数据——例如订单、会员、支付等——都是持久化到数据库中的,因为数据库能有很好的事务保证、持久化保证。但是,正因为数据库要能够满足这么多优秀的功能特性,使得数据库在设计上通常难以兼顾到性能,因此往往不能满足大型流量下的性能要求,像是
2022年4月28日

如何用Elasticsearch实现Word、PDF,TXT文件的全文内容检索?

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?简单介绍一下需求能支持文件的上传,下载要能根据关键字,搜索出文件,要求要能搜索到文件里的文字,文件类型要支持word,pdf,txt文件上传,下载比较简单,要能检索到文件里的文字,并且要尽量精确,这种情况下很多东西就需要考虑进去了。这种情况下,我决定使用Elasticsearch来实现。因为准备找工作刷牛客的原因,发现很多面试官都问到了Elasticsearch,再加上那时候我连Elasticsearch是什么东西都不知道,所以就决定尝试一下新东西。不得不说Elasticsearch版本更新的是真的快,前几天才使用了7.9.1,结果25号就出来了7.9.2版本。Elasticsearch简介Elasticsearch是一个开源的搜索文献的引擎,大概含义就是你通过Rest请求告诉它关键字,他给你返回对应的内容,就这么简单。Elasticsearch封装了Lucene,Lucene是apache软件基金会一个开放源代码的全文检索引擎工具包。Lucene的调用比较复杂,所以Elasticsearch就再次封装了一层,并且提供了分布式存储等一些比较高级的功能。基于Elasticsearch有很多的插件,我这次用到的主要有两个,一个是kibana,一个是Elasticsearch-head。kibana主要用来构建请求,它提供了很多自动补全的功能。Elasticsearch-head主要用来可视化Elasticsearch。开发环境首先安装Elasticsearch,Elasticsearch-head,kibana,三个东西都是开箱即用,双击运行。需要注意的是kibana的版本要和Elasticsearch的版本对应。Elasticsearch-head是Elasticsearch的可视化界面,Elasticsearch是基于Rest风格的API来操作的,有了可视化界面,就不用每次都使用Get操作来查询了,能提升开发效率。Elasticsearch-head是使用node.js开发的,在安装过程中可能会遇到跨域的问题:Elasticsearch的默认端口是9200,而Elasticsearch-head的默认端口是9100,需要改一下配置文件,具体怎么改就不详细说啦,毕竟有万能的搜索引擎。Elasticsearch安装完成之后,访问端口,就会出现以下界面。Elasticsearch主页面核心问题有两个需要解决的核心问题,文件上传和输入关键词查询。文件上传首先对于txt这种纯文本的形式来说,比较简单,直接将里面的内容传入即可。但是对于pdf,word这两种特殊格式,文件中除了文字之外有很多无关的信息,比如图片,pdf中的标签等这些信息。这就要求对文件进行预处理。Elasticsearch5.x以后提供了名为ingest
2022年4月27日

Podman是什么?它和Docker有什么不同?

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?容器编排工具作为当今最重要的Web开发技术之一,众多强者都在尝试争夺这一行业的主导地位。Podman是RedHat的一款产品,旨在使用类似于Kubernetes的方法来构建、管理和运行容器,作为一款主流容器的可靠替代产品,它吸引了开发人员的关注。自RHEL
2022年4月26日

架构师图谱之微服务&消息队列

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?概述“架构师图谱”是一个很宏大的命题,特别是优秀的架构师自身也是“由点到面再到图”,一点点成长积累起来,尝试写这篇文章的目的更多的是结合自身的一些架构、研发、管理经验对现阶段做一个复盘总结,所以这里更偏向于后端图谱,依赖于开源技术、云原生或者其他第三方服务。这里会重点介绍一些技术栈、设计理念以及适应场景,这些可以作为我们选型时的依据。所谓“架构即决策”,是在一个有约束的盒子中寻求最优解。这个有约束的盒子是团队经验、成本、资源、进度、业务所处阶段等编织、掺杂在一起的综合体。本质上无优劣,但是存在恰当的架构用在合适的软件系统中,而这些就是决策的结果。序章一个技术图谱:计划会分上、中、下三个篇章来介绍:上篇:重点聚焦在微服务和常用的消息队列,包括相关的选型以及一些理论基础中篇:主要集中在数据库、分布式(一致性/锁/缓存/发号/任务调度等),以及流媒体下篇:分享一些DevOps、项目管理、团队建设方向的一些经验完整的思维导图:公众号《架构师》发送:『0423』,查看高清图片。微服务微服务(英语:Microservices)是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块(Small
2022年4月23日

kubernetes的架构与组件

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?kubernetes架构目标kubernetes是生产级的,用于跨主机部署,扩展,管理和组合应用程序容器的基础设施。kubernetes不仅仅是“容器编排”,他更加主要的解决方向是消除协调计算资源,网络和存储的负担,使开发人员以容器为中心,实现自己出发主导资源操作流程。kubernetes还提供了一个稳定的,可移植的,用于构建定制的工作流和更高级别自动化的平台。kubernetes主要针对多个容器构成的应用程序。因此kubernetes使用pod和label来构建松散或紧密的容器编队,以便管理和发现。kubernetes在架构上包含哪些功能呢?首先必须是可扩展的,可插入式的。因此在架构上,kubernetes被构建成为一个可插入组件和层的集合,能够替代日常开发中的调度程序,控制器,存储系统和分发机制。如果设计的足够好的话,在使用更高级别的Paas功能或者多层集群时,就无需改动源码。由于上述原因他在设计的api的时候不仅针对最终使用kubernetes的用户,而且还针对工具和扩展开发人员。kubernetes的API旨在作为工具,自动化系统和更高API层面的开放生态系统。这种插件化的构造方式,使得kubernetes没有“内部”组件API这种东西。所有的API都是可见的和可用的,包括调度器scheduler,节点控制器node
2022年4月21日

谈谈如何设计好网站的URL

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?URL设计,这是一个非常重要但是往往容易给忽略的部分,也比较少架构师会去关注或者重视。在整个系统架构中,有时候一个好的URL设计对整个系统会起到一个好的作用。URI和URL及URNURL大家都比较熟悉,其他两个词就比较陌生了。URI、URL和URN是识别、定位和命名互联网上的资源的标准途径。1989年Tim
2022年4月10日

我在美团的八年

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?本篇文章原标题是《写给工程师的10条精进建议》,作者:云鹏,2014年加入美团,先后参与了美团酒店供应链体系、分布式调度系统的建设,现在负责美团旅行客户关系管理系统、基础信息服务的建设工作。引言时间回到8年前,我人生中的第一份实习工作,是在某互联网公司的无线搜索部做一个C++工程师。当时的我可谓意气风发,想要大干一场,结果第一次上线就写了人生中第一个Casestudy。由于对部署环境的不了解,把SVN库里的配置文件错误地发到线上,并且上完线就去吃晚饭了,等吃饭回来发现师傅在焦头烂额地回滚配置。那次故障造成了一个核心服务20分钟不可用,影响了几百万的用户。这仅仅是一个开始,在后来半年的时间里,我几乎把所有职场新人可能犯的错误都犯了个遍。架构师让我调研一个抓取性能提升方案,我闷头搞了两周,也没有得出任何结论;本来安排好的开发计划,由于我临时要回去写论文,搞得经理措手不及;参加项目座谈会,全程“打酱油”……那段时间,自己也很苦恼,几乎每天晚上11点多才走,很累很辛苦,但依然拿不到想要的结果。8年过去了,自己从一个职场小白逐步成长为一名技术Leader。我发现团队中的很多同学在不停地重复犯着自己当年类似的错误。他们并不是不努力,到底是哪里出了问题?经过一段时间的观察与思考后,我想我找到了答案。那就是:我们大多数同学在工作中缺乏原则的指导。原则,犹如指引行动的“灯塔”,它连接着我们的价值观与行动。不久前,桥水基金创始人雷·达里奥在《原则》一书中所传达的理念,引爆了朋友圈。每个人都应该有自己的原则,当我们需要作出选择时,一定要坚持以原则为中心。但是在现实生活中,我们往往缺少对原则的总结,对于很多人来说这是一门“只可意会不可言传”的玄学,是属于老司机的秘密,其实不然。“追求卓越”是美团的价值观。作为一名技术人员,我们应该如何践行呢?本文总结了十条精进原则,希望能够给大家带来一些启发,更好地指导我们的行动。原则一:Owner意识“Owner意识”主要体现在两个层面:一是认真负责的态度,二是积极主动的精神。认真负责是工作的底线。首先,要对我们交付的结果负责。项目中每一个设计文档、每一行代码都需要认真完成,要对它的质量负责。如果设计文档逻辑混乱,代码没有注释,测试时发现一堆Bug,影响的不仅仅是RD的工程交付质量,还会对协同工作的RD、QA、PM等产生不好的影响。久而久之,团队的整体交付质量、工作效率也会逐步下降,甚至会导致团队成员之间产生不信任感。其次,我们要对开发的系统负责。系统的架构是否需要改进,接口文档是否完善,日志是否完整,数据库是否需要扩容,缓存空间够不够等等,这些都是需要落地的事情。作为系统Owner,请一定要认真履行。积极主动是“Owner意识”更高一级的要求。RD每天要面对大量的工作,而且很多并不在计划内,这就需要具备一种积极主动的精神。例如我们每天可能会面对大量的技术咨询,如果客户提出的问题很长时间得不到回应的话,就会带来不好的客户体验。很多同学说忙于自己的工作没有时间处理,有同学觉得这件事不是很重要,也有很多同学是看到了,但是不知道怎么回答,更有甚者,看到了干脆装没看见。这些都是缺乏Owner意识的体现。正确的做法是积极主动地推动问题的解决,如果时间无法排开或者不知道如何解决,可以直接将问题反馈给能解决的同学。积极主动还可以表现在更多方面。比如很多同学会自发地梳理负责服务的现状,根据接口在性能方面暴露的问题提出改进意见并持续推动解决;也有同学在跨团队沟通中主动承担起主R的角色,积极发现问题、暴露问题,推动合作团队的进度,保证项目顺利推进。这些同学无一不是团队的中坚力量。所以,我们在做好自己份内工作的同时,也应该积极主动地投入到“份外”的工作中去。一分耕耘一分收获,不要给自己设限,努力成为一个更加优秀的人。原则二:时间观念相信大家都有时间观念,但是真正能执行到位的可能并没有那么多。互联网是一个快速发展的行业,RD的研发效率是一个公司硬实力的重要体现。项目的按期交付是一项很重要的执行能力,在很大程度上决定着领导和同事对自己靠谱程度的评价。大家可能会问:难度几乎相同的项目,为什么有的同学经常Delay,而有的同学每次都能按时上线?一个很重要的原因,就是这些按时交付的同学往往具备如下两个特质:做事有计划,工作分主次。工作安排要有计划性。通常,RD在设计评审之后就能预估出精确的开发时间,进而再合理地安排开发、联调、测试计划。如果是项目负责人,那么就会涉及协调FE、QA、PM等多个工种的同学共同完成工作。凡事预则立,不预则废。在计划制定过程中,要尽可能把每一项拆细一点(至少到pd粒度)。事实证明,粒度越细,计划就越精准,实际开发时间与计划之间的误差就会越小。此外,务必要规定明确的可检查的产出,并在计划中设置一些关键的时间点进行核对。无数血淋淋的事实告诉我们,很多项目延期都是因为在一些关键交付点上双方存在分歧造成的。例如后台RD的接口文档计划在周五提供,FE认为是周五上午,而RD认为是周五下班前提交,无形中会给排期带来了1pd的误差。所以,我们要做到计划粒度足够细,关键时间点要可检查。工作安排要分清楚主次。我们每天要面对很多的事情,要学会分辨这些工作的主次。可以尝试使用“艾森豪威尔法则”(四象限法则),把工作按照重要、紧急程度分成四象限。优先做重要紧急的事情;重要不紧急的事情可以暂缓做,但是要持续推进;紧急不重要的事情可以酌情委托给最合适的人做;不重要不紧急的事情可以考虑不做。很多项目无法按期交付的原因,都是因为执行人分不清主次。比如在开发中需要使用到ES,一些不熟悉ES的同学可能想系统性地学习一下这方面的知识,就会一头扎进ES的汪洋中。最后才发现,原本一天就能完成的工作被严重拖后。实际工作中,我们应当避免这种“本末倒置”的工作方式。在本例中,“系统性地学习ES”是一件重要但不紧急的事情。要学会分辨出这些干扰的工作项,保证重要紧急的事情能够按时交付。原则三:以终为始“以终为始”(Begin
2022年4月2日

亚马逊首席科学家李沐博士:工作五年反思

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?五年前的今天我飞往西雅图参加亚马逊的面试。面试完后连夜做红眼航班飞往波士顿赶去参加老婆在MIT的博士答辩。答辩一半的时候电话响了,对方说恭喜你面试通过,想聊下薪水。我说其实就面了你们一家,直接给就是,先挂了。答辩完第二天跟老婆去市政局登记结婚。在宣誓厅门口排队的时候,老板打电话过来,很兴奋的说你来了后可以做这个做那个。我说是挺好的,但先要结婚去了。老板一愣,道了一声恭喜,继续往下说。我不得不打断:得先走了,轮到我们进去宣誓了。五年一眨眼就过去了。外面来看最大的变化是多了两个娃。但最大的变化来自认知,是人生观、世界观、价值观的改变。博士毕业的时候曾写过我的体会:https://zhuanlan.zhihu.com/p/25099638很多同学留言说深受鼓舞。现在我想同样给大家分享这五年工作中的经验和感悟。更确切说是失败的教训,因为每一点就是付出了学费后获得的教训。希望这些同样能对大家有所帮助和启发。事情的价值是对社会的价值读书的时候,你会有明确的目标,例如考试的分数、深造的学校、或找到好工作。工作后的最大不同是你有太多可以最求的目标。这个带来的改变是你需要决定哪些事情现在做,哪些以后做,哪些可以不去做。决定优先级应该是根据事情的价值。我现在评估一件事的价值是它对社会的价值,用公式来写就是:受益人数
2022年3月26日

HTTP缓存协议实战

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?一、什么是缓存缓存,又称作Cache,我们把临时存储数据的地方叫做缓存池,缓存池里面放的数据就叫做缓存。当用户需要使用这些数据,首先在缓存中寻找,如果找到了则直接使用。如果找不到,则再去其他数据源中查找。二、为什么要使用缓存技术缓存的本质就是用空间换时间,以临时存储的数据暂时代替数据源中读取最新的数据,这种方式带来的好处在不同的场景下是不一样的。举个例子:当我们需要喝水时,我们会拿出一个水杯,去水龙头接一杯水来喝。大家可以思考一下,为什么用杯子来喝水,而不是直接用嘴巴在水龙头接水喝。用杯子喝水确实存在一些既有的问题,比如杯子里面的水容易变凉,而水龙头流出的水确是恒温的。我们可以想象一下,公司里的同事们排队在水龙头下面喝水的场面,确实有点滑稽,我们宁愿接受杯子里的水会变凉这个既有问题。用杯子喝水有以下几个优势:用杯子喝水解决了总是要去找水龙头的问题,因为杯子可以一次接更多的水。用杯子喝水更不容易洒出来,不容易浪费水。用杯子喝水比趴在水龙头下喝水更优雅。我们把杯子看成一个缓存池,杯中的水看成缓存,我们接受了杯中水会变凉的问题,相当于牺牲了数据的实时性。把这些优势换一个方式来描述,于是使用缓存的优势变成了下面几个:降低了系统压力;节省了资源消耗;优化用户体验。三、HTTP缓存的作用网络的其中一个特点就是不稳定性,很多用户受到网速慢的困扰。服务器在大量用户访问的场景下实时计算数据也很容易产生瓶颈,导致服务变慢。从缓存技术具备的优势来看,很适合解决网络服务不稳定的问题。四、HTTP缓存协议协议是沟通过程中双方都遵守并且使用的一种规则。举个栗子,客户端和服务器两位大兄弟在新款机型问题上进行了几次沟通?客户端:大哥,新款nex发布没?服务器:老弟,还没发,你记住,别老来问我!一周后......客户端:大哥,我又来了,最新情况如何?服务器:跟上次一样。一个月后.....客户端:大哥,这都一个月了,怎么样了啊?!服务器:已经开售啦!在这个例子里面,客户端与服务端沟通过程中就遵循某种规则,我们来看一下。数据部分:机型的内容;协议部分:1)别老来问我,2)最新情况如何,3)跟上次一样。服务端说的这些话,客户端都能看懂并且明白这些话中所蕴含的意义,这就是客户端与服务端之间达成的某种通讯协议。4.1
2022年3月22日

分布式事务提交协议: 2PC/3PC

8.如喜欢本文,请点击右上角,把文章分享到朋友圈如有想了解学习的技术点,请留言给若飞安排分享·END·相关阅读:一张图看懂微服务架构路线基于Spring
2022年3月9日

深入理解分布式缓存设计

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?前言在高并发的分布式的系统中,缓存是必不可少的一部分。没有缓存对系统的加速和阻挡大量的请求直接落到系统的底层,系统是很难撑住高并发的冲击,所以分布式系统中缓存的设计是很重要的一环。下面就来聊聊分布式系统中关于缓存的设计以及过程中遇到的一些问题。缓存的收益与成本使用缓存我们得到以下收益:加速读写。因为缓存通常是全内存的,比如Redis、Memcache。对内存的直接读写会比传统的存储层如MySQL,性能好很多。举个例子:同等配置单机Redis
2022年2月27日

面试不怂之redis与缓存大全

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?三万字长文,建议收藏,方便查阅目录:基础篇高级内容Redis设计篇Redis原理篇实操篇来吧,缓存面试基础篇问题:什么是redis?答:Redis
2022年2月17日

Redis和Mysql如何保持数据一致性

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题所以,我们都会用Redis来做数据的缓存,削减对数据库的请求但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了1.导致数据不一致的原因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。2.缓存先后删除问题不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。2.1
2022年2月13日

原来 Elasticsearch 还可以这么理解

File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。从上图我们可以了解到倒排索引主要由两个部分组成:词典倒排文件词典和倒排表是
2022年2月6日

如何构建10x程序员的思考模型

—效率问题程序员越高效产出越高,产出越高能力越强,于是形成一个增强环路。但是,就我观察,现实中的程序员,大部分没有用心去思考学习效率问题。1975年,弗雷德里克·布鲁克斯(Frederick
2022年2月3日

实战引入Elasticsearch的系统架构

f.CreateDateTime).GreaterThanOrEquals(request.BeginDateTime.Value).TimeZone(EsConst.TimeZone)));
2022年1月18日

何为微服务、网关、服务发现/注册?

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?随着互联网业务复杂性慢慢提高,单机服务的架构慢慢出现了生产效率问题微服务架构带来的有优点也有缺点,使用前需要调研清楚微服务架构的网关设计、服务注册/发现、配置管理都是关键点1.
2022年1月15日

100行代码透彻解析RPC原理

}}//================RegisterCenter#registerProvider======================@Overridepublic
2022年1月9日

烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?前言对于从事后端开发的同学来说,缓存已经变成的项目中必不可少的技术之一。没错,缓存能给我们系统显著的提升性能。但如果你使用不好,或者缺乏相关经验,它也会带来很多意想不到的问题。今天我们一起聊聊如果在项目中引入了缓存,可能会给我们带来的下面这三大问题。看看你中招了没?1.
2021年12月27日

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

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

Redis缓存使用技巧和设计方案

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析、缓存更新策略的选择和使用场景、缓存粒度控制方法、穿透问题优化、无底洞问题优化、雪崩问题优化、热点key重建优化。1)缓存的收益和成本分析下图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构。下面分析一下缓存加入后带来的收益和成本。收益:①加速读写:因为缓存通常都是全内存的,而存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效地加速读写,优化用户体验。②降低后端负载:帮助后端减少访问量和复杂计算(例如很复杂的SQL语句),在很大程度降低了后端的负载。成本:①数据不一致性:缓存层和存储层的数据存在着一定时间窗口的不一致性,时间窗口跟更新策略有关。②代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本。③运维成本:以Redis
2021年12月15日

kubernetes面试题汇总

k8s集群外流量怎么访问Pod?答:可以通过Service的NodePort方式访问,会在所有节点监听同一个端口,比如:30000,访问节点的流量会被重定向到对应的Service上面。23、
2021年11月26日

kafka三高架构设计剖析

当ISR中的副本数量小于min.insync.replicas时,Leader停止写入生产者生产的消息,并向生产者抛出NotEnoughReplicas异常,阻塞等待更多的
2021年11月25日

缓存和数据库一致性问题,看这篇就够了

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?如何保证缓存和数据库一致性,这是一个老生常谈的话题了。但很多人对这个问题,依旧有很多疑惑:到底是更新缓存还是删缓存?到底选择先更新数据库,再删除缓存,还是先删除缓存,再更新数据库?为什么要引入消息队列保证一致性?延迟双删会有什么问题?到底要不要用?...这篇文章,我们就来把这些问题讲清楚。这篇文章干货很多,希望你可以耐心读完。引入缓存提高性能我们从最简单的场景开始讲起。如果你的业务处于起步阶段,流量非常小,那无论是读请求还是写请求,直接操作数据库即可,这时你的架构模型是这样的:但随着业务量的增长,你的项目请求量越来越大,这时如果每次都从数据库中读数据,那肯定会有性能问题。这个阶段通常的做法是,引入「缓存」来提高读性能,架构模型就变成了这样:当下优秀的缓存中间件,当属
2021年11月23日

如何用 Redis 解决海量重复提交问题

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?前言在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义,最终的含义就是
2021年11月16日

Kafka万亿级消息实战

:https://cwiki.apache.orgZooKeeper集群上Kafka元数据恢复:我们会定期对ZooKeeper上的权限信息数据做备份处理,当集群元数据异常时用于恢复。1.11
2021年11月4日

Docker 从入门到精通(建议收藏的教程)

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?docker不是一个值得投入的领域,它解决的问题是Unix系统最初设计的一个疏忽。从一个不会用docker的小白,自己一步一步的摸索,中间也踩过许多坑。但任然,坚持从哪里跌倒就从哪里爬起来。不求感动自己,但求人生无悔。
2021年10月21日

浅谈 Kubernetes 中的服务发现

都是在同一个可路由的扁平的叠加网络上,剩下的内容就很简单了。如喜欢本文,请点击右上角,把文章分享到朋友圈如有想了解学习的技术点,请留言给若飞安排分享·END·相关阅读:Kubernetes
2021年10月20日

Nginx+Redis 搭建高性能缓存利器

0才运行定时任务定时更新redis,lua脚本中通过ngx.worker.id()获取worker进程编号。七
2021年10月17日

读文笔记:Kafka 官方设计文档

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?原文:http://kafka.apache.org/documentation/#design数据持久化不用惧怕文件系统磁盘的读写速度,取决于如何读写。对于线性读写方式,操作系统做了充分的优化:提前读
2021年10月16日

基于Spring Cloud的微服务架构分析

Eureka所选择的是AP,采用的是去中心化结构,放弃了强一致性。也就是说Eureka集群中的各个结点都是平等的,没有主从的概念。通过互相注册的方式来进行消息同步和保证高可用。并且一个Eureka
2021年10月10日

如何构建基于 DDD 领域驱动的微服务?

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?尽管微服务中的“微”一词表示服务的规模,但它并不是使用微服务的唯一标准。当团队转向基于微服务的架构时,他们旨在提高敏捷性以及自主且频繁地部署功能。很难确定这种架构风格的简单定义。我喜欢Adrian
2021年9月12日

Kafka的存储机制以及可靠性

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?一、kafka的存储机制1、segment2、读取数据二、可靠性保证1、AR2、生产者可靠性级别3、leader选举4、kafka可靠性的保证
2021年8月28日

分布式缓存的选择

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?分布式缓存的选择和问题如今,缓存系统的应用非常广泛,能够用来提高并发数、数据吞吐量,提高快速响应能力。那么当数据量达到一定程序,单机环境可能就显得有些力不从心了,就需要一个分布式缓存系统。1.
2021年8月22日

梳理消息队列 MQ/JMS/Kafka

openSession.getMapper(ProjectMapper.class);mapper.queryAllTaskByInit("init");JMS模型如下Connection
2021年8月12日

微服务等于Spring Cloud?了解微服务架构和框架

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?微服务初探什么是微服务首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应用,来理解什么是微服务。传统的WEB应用核心分为业务逻辑、适配器以及API或通过UI访问的WEB界面。业务逻辑定义业务流程、业务规则以及领域实体。适配器包括数据库访问组件、消息组件以及访问接口等。一个打车软件的架构图如下:尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用。例如Java应用程序会被打包成WAR,部署在Tomcat或者Jetty上。这种单体应用比较适合于小项目,优点是:开发简单直接,集中式管理基本不会重复开发功能都在本地,没有分布式的管理开销和调用开销当然它的缺点也十分明显,特别对于互联网公司来说:开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断代码维护难:代码功能耦合在一起,新人不知道何从下手部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉扩展性不够:无法满足高并发情况下的业务需求所以,现在主流的设计一般会采用微服务架构。其思路不是开发一个巨大的单体式应用,而是将应用分解为小的、互相连接的微服务。一个微服务完成某个特定功能,比如乘客管理和下单管理等。每个微服务都有自己的业务逻辑和适配器。一些微服务还会提供API接口给其他微服务和应用客户端使用。比如,前面描述的系统可被分解为:每个业务逻辑都被分解为一个微服务,微服务之间通过REST
2021年7月30日

别再用 kill -9 了,这才是微服务上下线的正确姿势!

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?对于微服务来说,服务的优雅上下线是必要的。就上线来说,如果组件或者容器没有启动成功,就不应该对外暴露服务,对于下线来说,如果机器已经停机了,就应该保证服务已下线,如此可避免上游流量进入不健康的机器。优雅下线
2021年7月24日

小团队真的适合引入SpringCloud微服务吗?

Header即可(基于Rabbitmq实现)。当日志汇总到日志系统后,如果出现问题,只需要捕获发生异常的RequestId或是TraceId即可进行问题定位运维监控在容器化之前,采用telegraf
2021年7月23日

Kafka宕机后不再高可用?探究Kafka高可用实现

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?问题要从一次Kafka的宕机开始说起。笔者所在的是一家金融科技公司,但公司内部并没有采用在金融支付领域更为流行的
2021年7月7日

系统架构设计:进程缓存和缓存服务,如何抉择?

但是我们尽量不要把redis当作数据库用,如果真的需要持久化数据,建议可以走MySQL:2.1、redis的定期快照不能保证数据不丢失2.2、redis的AOF会降低效率,并且不能支持太大的数据量
2021年7月2日

DDD兴起的原因以及与微服务的关系

另外项目从分析到开发经历的流程很长,很容易最终开发设计与需求实现的不一样,微服务主要就是解决第二阶段的这些痛点,实现应用之间的解耦,解决单体应用扩展性的问题。微服务存在的问题进入微服务之后
2021年6月23日

2万长文,一文搞懂Kafka

放到DelayedOperationPurgatory(延时管理器)中。假如在30秒之前如果所有follower都写入副本到本地磁盘了,那么这个任务就会被自动触发苏醒,就可以返回响应结果给客户端了,
2021年6月19日

微服务架构下的静态数据通用缓存机制

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?什么是静态数据为什么需要缓存通用缓存机制总结后记在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在的关键问题以及探寻通用的解决之道。什么是静态数据这里静态数据是指不经常发生变化或者变化频率比较低的数据,比如车型库、用户基本信息、车辆基本信息等,车型库这种可能每个月会更新一次,用户和车辆基本信息的变化来源于用户注册、修改,这个操作的频率相对也是比较低的。另外这类数据的另一个特点是要求准确率和实时性都比较高,不能出现丢失、错误,以及过长时间的陈旧读。具体是不是应该归类为静态数据要看具体的业务,以及对变化频率高低的划分标准。在这里的业务定义中,上边这几类数据都归为静态数据。为什么需要缓存在面向用户或车联网的业务场景中,车型信息、用户基本信息和车辆基本信息有着广泛而高频的业务需求,很多数据都需要对其进行关联处理。在这里缓存的目的就是为了提高数据查询效率。静态数据通常都保存在关系型数据库中,这类数据库的
2021年6月16日

微服务之间的最佳调用方式

架构师(JiaGouX)我们都是架构师!架构未来,你来不来?在微服务架构中,需要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。服务调用有两种方式,一种是RPC方式,另一种是事件驱动(Event-driven)方式,也就是发消息方式。消息方式是松耦合方式,比紧耦合的RPC方式要优越,但RPC方式如果用在适合的场景也有它的一席之地。我们总在谈耦合,那么耦合到底意味着什么呢?耦合的种类:时间耦合:客户端和服务端必须同时上线才能工作。发消息时,接受消息队列必须运行,但后台处理程序暂时不工作也不影响。容量耦合:客户端和服务端的处理容量必须匹配。发消息时,如果后台处理能力不足也不要紧,消息队列会起到缓冲的作用。接口耦合:RPC调用有函数标签,而消息队列只是一个消息。例如买了商品之后要调用发货服务,如果是发消息,那么就只需发送一个商品被买消息。发送方式耦合:RPC是点对点方式,需要知道对方是谁,它的好处是能够传回返回值。消息既可以点对点,也可以用广播的方式,这样减少了耦合,但也使返回值比较困难。下面我们来逐一分析这些耦合的影响。第一,时间耦合,对于多数应用来讲,你希望能马上得到回答,因此即使使用消息队列,后台也需要一直工作。第二,容量耦合,如果你对回复有时间要求,那么消息队列的缓冲功能作用不大,因为你希望及时响应。真正需要的是自动伸缩(Auto-scaling),它能自动调整服务端处理能力去匹配请求数量。第三和第四,接口耦合和发送方式耦合,这两个确实是RPC方式的软肋。事件驱动(Event-Driven)方式Martin
2021年6月12日

实现多级缓存架构设计方案

聚焦上述痛点,设计并实现了整体解决方案。以支持“热点探测”和“本地缓存”,减少热点访问时对下游分布式缓存服务的冲击,避免影响应用服务的性能及稳定性。TMC
2021年5月29日