
架构设计
文章平均质量分 87
360linker
360linker技术社区的发起人,曾在多家头部互联网公司任职,致力于打造一个帮助我们实现高效技能提升的圈子,分享IT圈内技术、产品、运营、市场等信息。
展开
-
RocketMQ消息顺序和消息重复的处理
消息顺序消息顺序是只可以按照消息发送的顺序进行消费。一个订单产生3条消息,订单创建、付款、订单完成。消费时只有按照顺序消费才有意义,不可能先消费付款消息再消费订单创建消息,这样就乱了。另外,多笔订单又可以并行消费。如何保证呢?一个订单产生的消息只能发送给同一个MQ服务器中的同一个分区,并且按顺序发送,这样才能在理论上保证消费者消费时是按照顺序消费的,因为一个分区就是一个逻辑队列。生产者虽然按顺序发送,但是第一条消息到达MQ的耗时比第二条多,那么第二条则会被先消费,这样就又导致消费时不是顺序的。那么如转载 2021-01-29 10:28:40 · 1244 阅读 · 0 评论 -
跳表的实现原理
我们知道二叉搜索算法能够高效的查询数据,但是需要一块连续的内存,而且增删改效率很低。跳表,是基于链表实现的一种类似“二分”的算法。它可以快速的实现增,删,改,查操作。我们先来看一下单向链表如何实现查找当我们要在该单链表中查找某个数据的时候需要的时间复杂度为O(n).怎么提高查询效率呢?如果我们给该单链表加一级索引,将会改善查询效率。如图所示,当我们每隔一个节点就提取出来一个元素到上一层,把这一层称作索引,其中的down指针指向原始链表。当我们查找元素16的时候,单链表需要..转载 2021-01-26 10:37:46 · 1392 阅读 · 1 评论 -
Java并发包JUC核心原理解析
JUC分类线程管理 线程池相关类 Executor、Executors、ExecutorService 常用的线程池:FixedThreadPool、CachedThreadPool、ScheduledThreadPool、SingleThreadExecutor 能获取子线程的运行结果 Callable、Future、FutureTask 并发流程管理CountDwonLatch、CyclicBarrier、Semaphore、Condition实现线程安..转载 2020-11-12 16:39:56 · 705 阅读 · 0 评论 -
网站架构演化路线,从小到大怎么成长的
首先我们要明确一个基本的认知,网站的大小并不是根本,我们的根本着眼点在于网站服务于业务的开展。随着业务规模的调整,同时进行网站规模,从而促进业务发展。大型网站的特点有高并发,大流量,高可用,海量数据等。我们一起回顾下网站的演化路线。1、初始阶段的网站架构初始阶段都比较简单,通常一台服务器就可以搞定一个网站了,看图。2、应用服务和数据服务分离随着网站业务的发展,一台服务器逐渐不能满足需求;这时候就需...原创 2018-03-25 13:33:36 · 424 阅读 · 0 评论 -
缓存问题(缓存穿透、缓存雪崩、缓存击穿)怎么处理?
设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。一、缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。缓存穿透解决方案有很多种方法可...原创 2018-04-17 15:30:51 · 1511 阅读 · 0 评论 -
大流量下多级缓存设计
什么是多级缓存所谓多级缓存,即在整个系统架构的不同系统层级进行数据缓存,以提升访问效率,这也是应用最广的方案之一。我们应用的整体架构如图1所示:图1 多级缓存方案整体流程如上图所示:1)首先接入Nginx将请求负载均衡到应用Nginx,此处常用的负载均衡算法是轮询或者一致性哈希,轮询可以使服务器的请求更加均衡,而一致性哈希可以提升应用Nginx的缓存命中率,相对于轮询,一致性哈希会存在单机热点问题...原创 2018-04-26 23:24:07 · 6032 阅读 · 1 评论 -
直播全流程探索
在这篇文章中:直播现状生成阶段音视频处理DIY视频处理DIY音频处理编码处理传输阶段呈现阶段自研sdk参考资料直播现状 上图列出的app都有涉足直播行业,可以看出目前的直播有多火。 我们按照整个视频内容的流动过程,将整个直播过程划分为三个阶段,生成阶段、传输阶段、呈现阶段。下面将对这些阶段进行一一介绍生成阶段生成阶段包括对音视频的采集和处理。音视频的采集,采集阶段主要是对原始视频内容进行采集即直播...转载 2018-06-04 13:36:13 · 2498 阅读 · 1 评论 -
Spring Cloud Eureka详解
一 Eureka服务治理体系1.1 服务治理服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装。主要负责完成微服务架构中的服务治理功能。 Eureka服务治理体系如下:1.2 服务注册在服务治理框架中,通常都会...转载 2018-05-28 14:00:38 · 363 阅读 · 0 评论 -
spring cloud : 网关Zuul(过滤:安全、监控、限流、路由)
单点搭建注意:蓝色虚线代表注册;绿色虚线代表调用、红色虚线代表心跳1. 添加依赖创建项目tcloud-gateway-zuulserver , pom.xml内容如下<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xs...转载 2018-05-28 14:14:43 · 1427 阅读 · 0 评论 -
Spring Cloud 客服端负载均衡 Ribbon
一、简介 Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。它不像服务注册中心、配置中心、API网关那样独立部署,但是它几乎存在于每个微服务的基础设施中。包括前面的提供的声明式服务调用也是基于该Ribbon实现的。理解Ribbon对于我们使用Spring Cloud来讲非常的重要,因为负载均...转载 2018-05-28 14:21:45 · 225 阅读 · 0 评论 -
客户端实现负载均衡:springCloud Ribbon的使用
客户端实现负载均衡:springCloud Ribbon的使用 Netfilx发布的负载均衡器,是一个基于http、tcp的客户端负载均衡工具,具有控制http、tcp客户端的行为,为ribbon配置服务提供者的地址后,ribbon就可以经过springCloud的封装实现客户端负载均衡的服务调用。 服务端负载均衡负载均衡主要是实现对系统的高可用、网络压力的缓解、处理能力的伸缩。对于数据流量...转载 2018-05-28 14:25:37 · 289 阅读 · 0 评论 -
移动端本地 H5 秒开方案探索与实现
| 导语 企业微信移动端项目中有需求要展示数据趋势的可视化图表,经过调研,最终决定以单页面 H5 来完成,对 APP 里的一些使用 H5 实现的功能模块,一般体验都比原生差,那么怎么提高h5加载速度?优化 h5 体验?适用场景:需要快速迭代、客户端难实现的、用作展示的功能模块,例如可视化图表。一、为什么 H5 体验糟糕为什么打开一个 H5 页面会有一长段白屏时间?因为它做了很多事情,大概是:初始化...转载 2018-06-11 12:40:23 · 309 阅读 · 0 评论 -
第三方账号登录功能接入完全流程
第三方账号虽然是一个小的功能点,但是在设计过程中,我们依然要结合自身产品的特点来确定产品方案和产品流程。本人在一家网络游戏公司工作,负责公司的基础平台性的产品。主要有用户中心、充值/支付平台、账号密保APP等。我们公司的用户中心之前没有接入第三方账号登录,虽然之前已经向公司提出过产品需求,因公司有一些战略考虑,也一直没有启动。这次趁着新游戏的接入工作,终于把这个项目提上日程。作为产品经理,我负...转载 2018-06-11 15:53:29 · 36124 阅读 · 0 评论 -
Redis 设计思路学习与总结
Redis是业界普遍应用的缓存组件,研究一个组件框架,最直观的办法就是从应用方的角度出发,将每个步骤的考虑一番,从这些步骤入手去研究往往能够最快的体会到一个组件框架的设计哲学。以Redis为例,每当发起一条请求时,redis是如何管理管理网络请求,收到请求后又是通过什么样的数据结构进行组织并操作内存,这些数据又是如何dump到磁盘实现持久化,再到多机环境下如何同步和保证一致性……本文就是从网络模型...转载 2018-06-11 16:14:36 · 317 阅读 · 0 评论 -
如何设计一个 RPC 系统
在这篇文章中:认识 RPC (远程调用)RPC方案的核心问题1 . 如何表示“远程”的信息2 . 函数的接口形式应该如何表示3. 用什么方法来实现网络通信业界方案举例1. CORBA2. JAVA RMI3. Windows RPC4. WebService & REST方案RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的...转载 2018-06-04 18:20:06 · 848 阅读 · 0 评论 -
git merge 和 git rebase 小结
git merge是用来合并两个分支的。git merge b # 将b分支合并到当前分支同样 git rebase b,也是把 b分支合并到当前分支-----------------------------------他们的 原理 如下:假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。$ git checkout -b mywork origin假设远程分支"...转载 2018-06-11 18:10:22 · 154 阅读 · 0 评论 -
tornado 简易教程
引言回想Django的部署方式以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有一个对应的线程来用web应用(如Django)进行处理。考虑两类应用场景 用户量大,高并发 如秒杀抢购、双十一某宝购物、春节抢火车票 大量的HTTP持久连接 使用同一个...转载 2018-06-05 07:34:57 · 26917 阅读 · 2 评论 -
为什么分布式一定要有一致性方案?
作者:孤独烟,中国平安研发工程师,目前负责规则云平台架构设计以及需求研发工作。毕业后一直从事Java开发工作,在Web开发、架构设计上有多年的实战经验。在MySQL性能优化、JVM调优、分布式领域有着丰富的经验。来自:cnblogs.com/rjzheng/p/9041659.html0 引言为什么写这篇文章?首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑...转载 2018-06-05 08:29:15 · 284 阅读 · 0 评论 -
关于HTTP协议,一篇就够了
HTTP简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于19...转载 2018-06-12 10:40:13 · 497 阅读 · 0 评论 -
分布式配置中心(Spring Cloud Config)
一、简介在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client...转载 2018-05-29 17:24:08 · 293 阅读 · 0 评论 -
很方便的密码加密算法BCrypt
摘要:用户表的密码一般都不是使用明文,使用明文坏处可以参考之前优快云数据库被黑导致用户密码泄露造成的影响。虽然使用明文也有一定的方便之处(毕竟现在的加密都是单向的,比如客户打电话问密码、老大或者上级问密码),但是我们完全可以根据用户提供的其他信息(比如密保让客户自己输入密码进行更改而不是直接告诉用户密码),无论怎么样明文存储密码的坏处一定大于好处。下面将介绍使用Spring Security时候...转载 2018-05-30 17:35:55 · 216551 阅读 · 0 评论 -
20款开源搜索引擎介绍与比较
开放源代码搜索引擎为人们学习、研究并掌握搜索技术提供了极好的途径与素材,推动了搜索技术的普及与发展,使越来越多的人开始了解并推广使用搜索技术。使用开源搜索引擎,可以大大缩短构建搜索应用的周期,并可根据应用需求打造个性化搜索应用,甚至构建符合特定需求的搜索引擎系统。搜索引擎的开源,无论是对技术人员还是普通用户,都是一个福音。 搜索引擎的工作流程主要分为三步:从互联网抓取网页→创建抓取网页的索引库→...转载 2018-06-21 11:50:07 · 16181 阅读 · 0 评论 -
王者荣耀高并发背后的故事
在这篇文章中:摘要背景一、挑战和问题1、 业务特点和挑战2、 目前存在的问题二、解决方案1、 突发池系统架构2、技术优化效果总结作者:黎斌摘要堪称中国最火爆的手机游戏“王者荣耀”,拥有亿级用户体量,千万级日活用户,如何快速、低成本地保障业务突发?本文从该问题出发,论述了问题对应的解决方案,并对其效果做出总结。背景“王者荣耀”是一款国民级手机游戏,用户体量巨大,而且一直保持着较高的更新频率。这种业务...转载 2018-06-06 17:27:42 · 284 阅读 · 0 评论 -
大道至简—GO语言最佳实践
在这篇文章中:Defer延迟处理机制我们为什么选择GO语言压力测试环境说明:开发过程中需要注意的点导读:2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效...转载 2018-06-13 19:13:28 · 423 阅读 · 0 评论 -
Java面试知识点解析——JVM篇
一、JVM 基础知识1)Java 是如何实现跨平台的?注意:跨平台的是 Java 程序,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM答:我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字节码文件。Java 虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行,也就是说,只要在不同平台上安装...转载 2018-06-13 22:45:02 · 201 阅读 · 0 评论 -
DAPP超详细解释
一、DAPP到底是个什么玩意?DAPP是Decentralized Application的缩写,翻译过来就是去中心化应用,也称为分布式应用。它之所以被认为开启了区块链3.0时代,是因为DAPP与我们当前所认识到的APP不同,不同在哪里呢?它的特殊性当然不仅局限于多了脑袋“D”,而在于它的后台,是区块链啊!按照区块链目前的热度,但凡和它扯上点关系的东西,都变得非常高级有木有。这里用一句非常直白的话...转载 2018-06-22 16:33:24 · 14291 阅读 · 4 评论 -
Zuul中整合Swagger2,实现对源服务API测试
前言我们知道,Swagger2整合到项目中,可以非常方便地进行接口测试,是前后端对接效率提高。现在,我们可以在Zuul中整合Swagger2,通过Zuul配置文件配置的映射路径,来生成源服务接口的测试Dashboard。 github项目源码地址1、Zuul Server工程pom.xml文件中引入依赖: <dependency> <grou...转载 2018-06-08 15:16:06 · 1111 阅读 · 0 评论 -
为什么Netflix的API网关Zuul要升级为异步非阻塞架构?
Netflix宣布了通用API网关Zuul的架构转型。Zuul原本采用同步阻塞架构,转型后叫作Zuul2,采用异步非阻塞架构。Zuul2和Zuul1在架构方面的主要区别在于,Zuul2运行在异步非阻塞的框架上,比如Netty。Zuul1依赖多线程来支持吞吐量的增长,而Zuul 2使用的Netty框架依赖事件循环和回调函数。某组织对负责这次转型的Netflix项目经理Mikey Cohen进行了采访...转载 2018-06-08 15:20:58 · 446 阅读 · 0 评论 -
JVM内存状况查看方法和分析工具
Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及JVM内存的状况,同时开源界和商业界也有一些工具可用于查看、分析GC及JVM内存的状况。通过这些分析,可以排查程序中内存泄露的问题及调优程序的性能。下面介绍几种常用的免费工具,其中知名的有JProfiler 等。 1. 输出GC日志 输出GC日志对于跟踪分析GC的状况来说,无疑是最直接地分析内存回收状况的方法,只是GC日志...转载 2018-06-15 16:24:03 · 212 阅读 · 0 评论 -
每秒处理10万订单支付架构
一、库分表在redis,memcached等缓存系统盛行的互联网时代,构建一个支撑每秒十万只读的系统并不复杂,无非是通过一致性哈希扩展缓存节点,水平扩展web服务器等。支付系统要处理每秒十万笔订单,需要的是每秒数十万的数据库更新操作(insert加update),这在任何一个独立数据库上都是不可能完成的任务,所以我们首先要做的是对订单表(简称order)进行分库与分表。在进行数据库操作时,一般都会...转载 2018-06-08 16:09:35 · 343 阅读 · 0 评论 -
图片流量节省大杀器:基于 CDN 的 sharpP 自适应图片技术实践
效果数据目前手Q增值业务:VIP中心、游戏中心、动漫、游戏公会、特别关心 以及增值渠道的QQ钱包,空间的个性化商城已经接入sharpP自适应,优化效果数据:sharpP自适应方案在原有webP自适应方案效果提升40%-50%,提升效果主要来自sharpP高于webP的编码压缩率,同时能优化到webP无法覆盖的png图片(备注:之前webP无痛方案只实现了jpg的支持),sharpP方案和原图对比可...转载 2018-06-19 08:42:50 · 451 阅读 · 0 评论 -
mysql的sql执行计划详解
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。explain执行计划包含的信息其中最重要的字段为:id、type、key、rows、Extra各字段详解idselect查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 三种情况: 1、id相同:执行顺序由上至下 2、id不同:如果...转载 2018-06-19 09:02:47 · 14733 阅读 · 1 评论 -
APP中的 H5和原生页面如何分辨、何时使用
一、APP内嵌H5和原生的区别1、原生的页面运行速度快,比较流畅。H5页面相对原生的运行性能低,特别是一些动画效果有明显卡顿。2、H5页面的很多交互都没有原生的好,比如弹层、输入时候的页面滑动 等。H5的效果相对比较low,没有原生的好看,也没有原生默认的动画等效果。3、原生APP修改页面要重新发布,等待审核(现在iOS的审核速度已经提高到1天到2天)。H5页面的修改 可以随时上线,不用等待审核。...转载 2018-06-19 09:08:47 · 1896 阅读 · 0 评论 -
Spring Boot启动过程源码分析
关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到如今可以这么简便。1. 入口类package com.example.demo;import org.springframework.boot.SpringApplication;import ...转载 2018-06-19 18:29:04 · 211 阅读 · 0 评论 -
Spring Boot 启动过程定制化
在上一篇文章中,从源码角度介绍了Spring Boot的启动过程。启动的代码虽然只有短短的一行,但是背后所做的工作还真不少,其中有一些可以定制化的部分,主要分为以下几个方面:初始化器(Initializer)监听器(Listener)容器刷新后置Runners(ApplicationRunner或者CommandLineRunner接口的实现类)启动期间在Console打印Banner的具体实现类...转载 2018-06-19 18:30:01 · 320 阅读 · 0 评论 -
注解之@EnableDiscoveryClient与@EnableEurekaClient
在之前的一篇文章Spring Cloud feign使用中在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow上面找到的对这两者的解释:There are multiple implementations of "Discovery Service"...转载 2018-06-26 22:42:07 · 718 阅读 · 0 评论 -
一些小团队的自动化运维实践经验
题记: 幸福的家庭都是相似的 不幸的家庭各有各的不幸行业内各巨头的自动化运维架构都各种功能各种酷炫,如下图,让人可望不可及。现在最终的样子大家都知道了,但问题是如何根据自己团队当前的情况一步步向那个目标演进?笔者所在团队,三个半开发,要维护几十台云机器,部署了十来个应用,这些应用90%都是遗留系统。应用系统的编译打包基本在程序员自己的电脑上。分支管理也清一色的 dev 分支开发,测试通过后,再合并...转载 2018-06-20 15:00:23 · 432 阅读 · 1 评论 -
HTTP状态码100-500+详解
1xx响应信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx • 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新) • 101 - Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新) 2xx - 成功 这类状态代码表明服务器成功地接受了客户端请求。 •...转载 2018-06-20 14:58:13 · 294 阅读 · 0 评论 -
Gradle构建多模块项目
通常我在使用Maven构建项目的时候是将应用项目划分为多个更小的模块。Gradle 项目也拥有多于一个组件,我们也将其称之为多项目构建(multi-project build)。我们首先创建一个多项目构建:mkdir cmdGradleProj && cd cmdGradleProjgradle init这时候D:\cmdGradleProj> 目录下执行:tree /f的项...转载 2018-07-03 18:30:42 · 1150 阅读 · 0 评论 -
每秒处理10万订单支付架构
一、库分表在redis,memcached等缓存系统盛行的互联网时代,构建一个支撑每秒十万只读的系统并不复杂,无非是通过一致性哈希扩展缓存节点,水平扩展web服务器等。支付系统要处理每秒十万笔订单,需要的是每秒数十万的数据库更新操作(insert加update),这在任何一个独立数据库上都是不可能完成的任务,所以我们首先要做的是对订单表(简称order)进行分库与分表。在进行数据库操作时,一般都会...转载 2018-07-03 18:33:24 · 262 阅读 · 0 评论