0%

    作为程序员,在工作过程中遇到问题是在所难免的。如果对于处理问题没有一个恰当的方式的话会弄的自己手忙脚乱,并且没有处理妥当的话下次遇到同样的问题依然是手忙脚乱,显得自己愚昧至极。所以我总结了处理问题的三大流程,分享出来。

分析

  • 调心态:首先合理处理突发问题需要一个平静的心态,人只有在静下来才能去分析问题。我们需要做到的是不急不慌,沉住气,稳住神。
  • 理问题:心态搞好了,我们就可以去了解清楚是怎么回事,搞清楚问题发生的现场以及各种有关的导致发生的因素。
  • 定目标:找到了问题的根源,我们下一步就要思考解决问题的思路,以及能够达到的目标。

讨论

  • 列资源:列出解决问题所需要的所有资源:人、财、物、时间。
  • 拆问题:把问题进行拆细分,找出问题的具体发生环节。
  • 定方案:探讨商量大家都能够接受的方案。

执行

  • 去执行:方案一经确认,马上执行,不拖不误。
  • 去改进:执行过程中要根据情况进行修正,使之更符合实际的解决情况。
  • 勤总结:回顾之前的八步总结方法,把问题归类成一个大纲性的问题,为下次遇到类似的问题给予经验的帮助。

篇后

    经过这三个流程的走动后,问题就会被理性化地解决。

什么是 Kafka

    Kafka 是一个分布式的,支持多分区、多副本的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统,简单来说就是一个分布式消息队列。
    在2.8版本之前,无论是Kafka 集群,还是consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。2.8版本之后使用内嵌的KRaft作为zookeeper部分功能的替代品。

阅读全文 »

本文基于[凤凰架构](https://icyfenix.cn/)网站的基础上复制缩减而成。

服务架构的的演进史

原始分布式时代

    在 20 世纪 70 年代末期到 80 年代初,计算机科学刚经历了从以大型机为主向以微型机为主的蜕变,计算机逐渐从一种存在于研究机构、实验室当中的科研设备,转变为存在于商业企业中的生产设备,甚至是面向家庭、个人用户的娱乐设备。
    当时计算机硬件局促的运算处理能力,已直接妨碍到了在单台计算机上信息系统软件能够达到的最大规模。为突破硬件算力的限制,各个高校、研究机构、软硬件厂商开始分头探索,寻找使用多台计算机共同协作来支撑同一套软件系统运行的可行方案。这一阶段是对分布式架构最原始的探索,从结果来看,历史局限决定了它不可能一蹴而就地解决分布式的难题,但仅从过程来看,这个阶段的探索称得上成绩斐然。研究过程的很多中间成果都对今天计算机科学的诸多领域产生了深远的影响,直接牵引了后续软件架构的演化进程。譬如NCA(Network Computing Architecture)是未来远程服务调用的雏形,卡内基·梅隆大学提出的AFS 文件系统(Andrew File System)是日后分布式文件系统的最早实现;麻省理工学院提出的Kerberos 协议是服务认证和访问控制的基础性协议,是分布式服务安全性的重要支撑,目前仍被用于实现包括 Windows 和 MacOS 在内众多操作系统的登录、认证功能,等等。

阅读全文 »

redis的官网简介

    Redis 是一个开放源码(BSD 许可)、内存中的数据结构存储,用作数据库、缓存和消息代理。Redis 提供数据结构,例如string字符串、hash散列、list列表、set集合、sorted set带有范围查询的排序集、bitmaps位图、hyperloglogs超级日志、geospatial indexes地理空间索引、 streams流。Redis 具有内置的复制、 Lua 脚本、 LRU 收回、事务和不同级别的磁盘持久性,并通过 Redis Sentinel 提供高可用性服务,并通过 Redis Cluster 提供自动分区。
    您可以对这些类型运行原子操作,比如附加到字符串; 在散列中递增值; 将元素推入列表; 计算集合的交集、并集和差集; 或者获得排序集中排名最高的成员。
    为了获得最佳性能,Redis 使用内存中的数据集。根据您的用例,您可以通过定期将数据集转储到磁盘或将每个命令附加到基于磁盘的日志中来持久化数据。如果您只需要一个功能丰富的网络化内存缓存,那么还可以禁用持久性。
    Redis 还支持异步复制,具有非常快的非阻塞第一同步,自动重连接和部分重新同步的网络分割。
    其他功能包括:

阅读全文 »

    在高并发或者是安全要求下,后端接口会有多次执行的结果与一次执行的结果要一致的要求,这种接口就叫幂等性接口,需要用到幂等性的接口比较常见的就是用户下单支付等,防止出现重试时对业务造成巨大灾害的危险。下文为设计方案的各个要点。

阅读全文 »

线程池是什么

    线程池是一种基于池化思想管理线程的工具,是存储线程的容器,线程事先创建好后放入线程池,当有任务需要执行时,直接从线程池拿空闲线程使用,使用完毕后归还给线程池.

阅读全文 »

域名解析

    搜索浏览器自身的dns缓存,找不到就搜索系统的缓存,还是找不到就去hosts里找,还是找不到就去域名服务器里找。搜索成功拿到ip的话,接下来就是tcp连接。

阅读全文 »

    消息中间件是分布式系统常用的组件,无论是异步化、解耦、削峰等都有广泛的应用价值。

    我们通常会认为,消息中间件是一个可靠的组件——这里所谓的可靠是指,只要我把消息成功投递到了消息中间件,消息就不会丢。
    即消息肯定会至少保证消息能被消费者成功消费一次,这是消息中间件最基本的特性之一。
    也就是我们常说的“AT LEAST ONCE”,即消息至少会被“成功消费一遍”。
举个例子,一个消息 M 发送到了消息中间件,消息投递到了消费程序 A。A 接受到了消息,然后进行消费。但在消费到一半的时候程序重启了,这时候这个消息并没有标记为消费成功,这个消息还会继续投递给这个消费者,直到其消费成功了,消息中间件才会停止投递。
然而这种可靠的特性会导致消息可能被多次地投递,这时候就可能出现程序 A 接受到这个消息 M 并完成消费逻辑之后,正想通知消息中间件“我已经消费成功了”的时候,程序就重启了,那么对于消息中间件来说,这个消息并没有成功消费过,所以它还会继续投递,但这时候对于应用程序 A 来说,看起来就是这个消息明明消费成功了,但是消息中间件还在重复投递。

阅读全文 »

基础架构

    这是官网的一个架构图,总体是可以分为四层的。

  • 连接层:最上层是一些客户端和连接服务。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
  • 服务层:第二层服务层,主要完成大部分的核心服务功能, 包括查询解析、分析、优化、缓存、以及所有的内置函数,所有跨存储引擎的功能也都在这一层实现,包括触发器、存储过程、视图等
  • 引擎层:第三层存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取
  • 存储层:第四层为数据存储层,主要是将数据存储在运行于该设备的文件系统之上,并完成与存储引擎的交互
    阅读全文 »

什么是netty

    netty是一个 nio 客户机服务器框架,它支持快速简单地开发网络应用程序,如协议服务器和客户机。它极大地简化了网络编程,如 TCP 和 UDP 套接字服务器。经过多年的发展它已成为构建一个java网络生态的首选架构,在一些开源的项目中可见。
    netty是一个异步、事件驱动的网络框架,整个netty的api都是异步设计,对网络应用来讲,io一般是性能的瓶颈,使用异步io可以较大程度上提高程序性能。
    下面是官网的netty框架的图:

阅读全文 »