- 浏览: 2253399 次
- 性别:
- 来自: 北京
最新评论
-
yidongnan:
跟 spring boot 配合的例子可以使用这个库https ...
GRPC原理解析 -
kyo472083100:
写得很好,感谢楼主解释得很清晰
Mongodb中Mapreduce特性与原理 -
lanhz:
对于三个节点:1、2、3,如果2向1广播投给2(即2自己),1 ...
Zookeeper选举过程描述与状态迁移 -
Bll:
厉害了
GRPC原理解析 -
QING____:
xiatiandebaofengyu 写道有个问题:发布者在发 ...
Redis编程实践【pub/sub】
文章列表
nginx实现简单的A-B测试(灰度发布)
- 博客分类:
- nginx
灰度发布,现在是很多大项目的一个标配运维特性,我们可以将一个“新的版本代码”发布到集群中的少数几台(组)机器上,以便引入线上少量真实用户进行测试,用于验证产品改进的收益、小规模试错等。nginx提供了“nginx_http_split_clients_module”、“nginx_stream_split_clients_module”,分别适用于http和tcp,可以帮助我们简单实现这些功能,不过如果你需要高度自动化、自主化的特性,或许需要进行一定的扩展和改造。
split模块在0.8版本就已经有了,使用起来也非常简单:
split_clients string ...
前言:本文摘自infoQ《架构师》期刊201606期中《谈谈后端业务系统的微服务化改造》一文,作者:张旭;与本文相关的文献包括:1)《微服务(翻译版)》2)《微服务(原文)》;非常感谢多位作者为我们提供如此优秀的文档!
1. 篇首语
业务系统是任何一个用户产品的必须组成,充当着一个门面的角色,用户的输入就是这个系统需要维护的,数据存取是整个系统的核心。例如,广告业务系统的输入是广告主的投放约束、定向条件,微博业务系统的输入是短文字、图片等。
在应用发展初期或者规模不大的情况下,有非常简单的实现方案,LNMP、JSP、PyWeb都是你能随口说出来的词,如果用 ...
JAVA WEB项目中开启流量控制Filter
- 博客分类:
- JAVA
前言:流量控制,即Flow Control,主要是用来限定server所能承载的最大(高并发)流量峰值,以免在峰值是Server过载而宕机,对于WEB系统而言,通常是分布式部署,如果请求并发量很大,会导致整个集群崩溃,也就是通常所说的“雪崩效应”。所以,我们不仅在网络代理层面(比如nginx)设置流量控制以抵抗、拒止溢出流量,我们还应该在application server层面有一定的自我保护策略,确保当前JVM的负载应该在可控范围之内,对于JVM承载能力之外的请求,应该被合理管理。
本文主要通过开发一个Filter,来限定application的并发量:
...
我们有时候需要控制SQL查询的最大耗时,比如一个“执行时长”的SQL在指定时间内如果没有执行完毕,我们需要“取消”此SQL,我们知道在JDBC中Statement类可以通过setQueryTimeout()来实现此特性。
当设置query timeout之后,JDBC客户端发送请求,并等待直到执行完成或者超时,当超时后,客户端尝试cancel当前SQL,要求mysql server中断执行,因为网络通讯需要时间,可能在客户端尝试cancel时,mysql server已经执行成功,此时请求将会返回(而不是取消);超时后取消成功,那么当前客户端调用将会抛出SQLTimeout ...
几个JAVA常用的监控、调优工具
- 博客分类:
- JAVA
一、jps:JVM Process Status Tool,查看当前机器上所有JVM进程的状态和启动参数
命令格式:jps [options] [hostid]
我们可以通过“jps --help”来查看相关帮助。如下为允许使用的options:
1)-q:只列出JVM进程的id,不展示进 ...
Phaser功能简述
- 博客分类:
- JAVA
在JAVA 1.7引入了一个新的并发API:Phaser,一个可重用的同步barrier。在此前,JAVA已经有CyclicBarrier、CountDownLatch这两种同步barrier,但是Phaser更加灵活,而且侧重于“重用”。
一、简述
1、注册机制:与其他barrier不同的是,Phaser中的“注册的同步者(parties)”会随时间而变化,Phaser可以通过构造器初始化parties个数,也可以在Phaser运行期间随时加入(register)新的parties,以及在运行期间注销(deregister)parties。运行时可以随时加入、注销par ...
Spring + JPA实现数据库读写分离
- 博客分类:
- JAVA
SQL的读写分离方案,是一种通用的设计,通常可以较好的提升数据库集群的整体负载能力,当一个mysql实例无法支撑客户端的读写负载时,我们首先会想到对数据库进行“读写分离”
1)在数据库的架构层面,我们使用M-S架构模式,即一主多从,Master主要用于处理write、transaction等核心操作,这些操作必须发生在master上,否则将会导致数据一致性问题。对于slaves,通常用于分流read操作,对于那些对数据实时性要求不高、批量读取、SLOW SQL等操作,我们应该将它们分配到slaves中。
2)能进行读写分离的前提,一个非常重要的指标,就是“集 ...
Tomcat JNDI连接池配置
- 博客分类:
- JAVA
对于线上应用,我们通常将数据库连接交给容器,比如tomcat容器,那么开发者只需要通过JNDI的方式获取dataSource即可,不需要再关注数据库地址、密码等敏感信息,这样我们就可以简单做到配置隔离。
1)在tomcat的context.xml中增加如下配置:
<Resource name="jdbc/localDB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
auth="Container"
...
GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x +。GRPC与thrift、avro-rpc等其实在总体原理上并没有太大的区别,简而言之GRPC并没有太多突破性的创新。(如下描述,均基于JAVA语言 ...
Redis Cluster实现原理
- 博客分类:
- Redis
一、Redis Cluster主要特性和设计
集群目标
1)高性能和线性扩展,最大可以支撑到1000个节点;Cluster架构中无Proxy层,Master与slave之间使用异步replication,且不存在操作的merge。(即操作不能跨多个nodes,不存在merge层)
2)一定程度上保证writes的安全性,需要客户端容忍一定程度的数据丢失:集群将会尽可能(best-effort)保存客户端write操作的数据;通常在failover期间,会有短暂时间内的数据丢失(因为异步replication引起);当客户端与少数派的节点处于网络分区时(netwo ...
Redis Cluster实践
- 博客分类:
- Redis
Redis Cluster提供了在多个redis实例间数据自动分片(sharded)的特性,同时在partitions之间提供了一定程度的可用性保障,比如一些nodes失效时集群仍可以继续读写操作;不过当集群中较大规模的节点失效会导致集群停止服务, ...
一、指定一个正序排列的数组和目标数字S,从数组中找到两个元素它们的和值为S(数字不重复,如果有多个,只需要得到一组即可)
题目很好理解,比如输入数组{1,3,4,6,8,11,20}和目标数字11,那么其中3、8的和值为11,找到它们即可。
这个题目最粗暴的解法就是逐个元素遍历数组,逐个相加...比如从1开始,让1与此后的每个元素相加并判断和值是否等于11,直到相等或者和值大于11结束,当和值大于11时,则结束本次遍历,然后从3开始再开始一轮...时间复杂度很高。
这个题的关键:数组是排序的,既然只需要找到一对元素即可,那么我们假定它的值是一个大数 + 小 ...
一、给定一个整数序列,请获取最小(最大)的K个数字
这个题还算比较熟悉,在大数据计算时,经常会遇到类似于“Top N”的情况,这个题的解法有很多种,本例还是采用惯例做法:创建一个K大小的容器,容器内的数字都 ...
一、请使用栈,设计一个数据结构,它具有栈的“先进后出”的特性,同时还可以获取栈中的最小值,要求此数据结构的pop、push、min方法的复杂度均为O(1)
这个题,最大的问题就在min方法上,如果不使用其他的辅助数据结构,是无法满足min方法的设计要求,即使使用一个临时变量保存当前的最小值(这种情况下,如果最小是被pop,就断片了。。)。所以我们的注意力就集中在:怎们能让一个栈是有序的?其实让栈内数据有序,使用排序的思路肯定是不行的,但是我们能够维持“最小值”的连续性就可以。看看如下的设计思路:
使用2个栈来设计这个数据结构,分别为数据栈和辅助栈
数据栈用来保存push的数据
...
一、用栈来实现队列的功能
描述:栈,stack,特点是先进后出;队列,queue,先进先出;请使用栈来实现队列的功能,且此队列具有两个基本操作--添加、删除。
这个题本身并不难,但是不能钻”牛角尖“;一个栈是无论如何也无法实现队列的,那么可以考虑用两个栈来试一试:
1)两个栈A、B,其中一个只能“添加”,另一个只能“删除”。
2)初始时,栈为空,如果执行“添加”操作,则选定其中一个栈A保存元素,。
3)如果此后执行“删除”操作,则将栈A的元素逐个pop,且添加到栈B中,此后原来的栈底成了B的栈顶;那么此时从B中移除的元素,就是最早插入的 ...