你们的项目为什么要用RabbitMQ? 消息队列的作用是系统解耦.同步改异步.请求消峰,举个下订单的例子: 前端获取用户订单信息,请求后端的订单创建接口.这个接口并不直接请求订单服务,而是首先生成唯一订单编号,再组装一个订单消息并发送给RabbitMQ,然后返回唯一订单编号给前端.前端会根据唯一订单编号轮询订单状态接口,如果订单创建成功,则拉起支付界面引导用户付款.作为消费者,订单服务收到订单消息后,开始检查参数.检查库存.生成订单等等核心业务流程. 解耦体现在订单创建接口并没有直接访问订单服务…
你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方式收集日志,通过kafaka发送出去. kafa存在丢消息的情况吗,怎么解决? producer把消息发送给broker,因为网络抖动,消息没有到达broker,且开发人员无感知. 解决方案:producer设置acks参数,消息同步到master之后返回ack信号,否则抛异常使应用程序感知到并在业…
你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案? 我们采用的官方Redis Cluster方案.Codis是一整套缓存解决方案,采取的代理模式实现了高可用.数据分片.监控.动态扩态等功能,但是部署太复杂了.Cluster要简单很多,而且也基本满足目前的需要. Redis Cluster有什么缺点吗,或者说不适合什么场景? 这种模式将存储和元数据…
说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eureka.client.service-url.defaultZone: {address},address是其他节点的地址.如果是node1,address就是http://node2/eureka,http://node3/eureka,其他节点依次类推. 启动三个实例,注册信息会在他们之间互相同步.…
StringBuffer与StringBuild的区别 频繁修改字符串时,建议使用StringBuffer和StringBuilder类.StringBuilder相较于StringBuffer有速度优势,要求线程安全的情况下,必须使用StringBuffer类. 为什么拼接String不推荐用加号 String的值是不可变的,每次对String的操作都会生成新的String对象,不仅效率低下,而且消耗大量内存空间. 为什么String是不可变的 String类内部所有的字段都是final修饰的…
TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量.它本质上是描述接收方的TCO数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据.这个窗口大小为0时,发送方将停止发送数据.启动定时器,等待这个窗口变成非0.   滑动窗口协议必须保证数据包的按序传输,发送窗口中的序列号代表已发送但尚未收到确认的数…
HTTP状态码302的跳转逻辑 302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B. 302与301的区别和使用场景 301是永久重定向,而302是临时重定向.301适合做永久重定向: 302适合做临时的跳转. 301的定义:301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个…
synchronized怎么用的? 用过,synchronized是常用的并发控制关键字,简单的说就是访问加锁.它可以修饰静态方法或者一个类的class对象,这叫类锁:可以修饰普通方法或者代码块,这叫对象锁. synchronized是可重入锁吗? 从互斥锁的设计上来说,当一个线程试图操作一个由其他线程持有的对象锁的资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的资源时,这种情况属于重入锁,请求将会成功.java中synchronized是基于原子性的内部锁机制,是可重入的. sy…
HashMap的put操作做了什么? HashMap的是由数组和链表构成的,JDK7之后加入了红黑树处理哈希冲突.put操作的步骤是这样的: 根据key值计算出哈希值作为数组下标.如果数组的这个位置是空的,把k放进去,put操作就完成了. 如果数组位置不为空,这个元素必然是个链表.遍历链表逐一比对value,如果value在链表中不存在,就把新建节点,将value放进去,put操作完成. 如果链表中value存在,则替换原节点的value,put操作完成. 如果链表节点数已经达到8个,首先判断当…
服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执行"top -Hp 进程号"命令:查看java进程下的所有线程占CPU的情况. 执行"printf "%x\n 10"命令 :后续查看线程堆栈信息展示的都是十六进制,为了找到咱们的线程堆栈信息,把线程号转成16进制.例如,printf "%x\n 1…
为什么ConcurrentHashMap是线程安全的 JDK1.7中,ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问. 那说说JDK1.7中Segment的原理 刚刚说的一段一段就是指Segment,它继承了ReentrantLock,具备锁和释放锁的功能.ConcurrentHashMap只有16个Segment,并且不会扩容,最多可以支持16个线程并发写. JDK…
一个线程调用两次start会怎么样 Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常. 谈谈线程的生命周期和状态转移 新建(NEW),表示线程被创建出来还没真正启动的状态,可以认为它是个Java内部状态. 就绪(RUNNABLE),表示该线程已经在JVM中执行,当然由于执行需要计算资源,它可能是正在运行,也可能还在等待系统分配给它CPU片段,在就绪队列里面排队. 在其他一些分析中,会额外区分一种状态RUNNING,但…
说说Atomiclnteger的使用场景 AtomicInteger提供原子操作来进行Integer的使用,适合并发情况下的使用,比如两个线程对同一个整数累加. 为什么Atomiclnteger是线程安全的,原理是什么 AtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于CAS(compare-and-swap)技术.CAS表现为一组指令,当利用CAS执行试图进行一些更新操作时,会首先比较当前数值,如果数值未变,代表没有其它线程进行并发修改,则…
说说TCP三次握手的过程? 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态. 第三次握手:Client收到确认后,检查ack是否…
如何保证Redis高可用和高并发? Redis主从架构,一主多从,可以满足高可用和高并发.出现实例宕机自动进行主备切换,配置读写分离缓解Master读写压力. Redis高可用方案具体怎么实施? 使用官方推荐的哨兵(sentinel)机制就能实现,当主节点出现故障时,由Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性.它有四个主要功能: 集群监控,负责监控redis master和slave进程是否正常工作. 消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警…
Dubbo应用为什么要部署Zookeeper? Zookeeper用来注册和发现服务,简单说就是提供端注册接口信息到Zookeeper,调用端在Zookeeper上查找接口对应的服务IP和端口.由于Zookeeper集群的高可用性,Dubbo推荐采用Zookeeper作为服务治理的基础组件. Zookeeper怎么做到高可用的? ZooKeeper集群解决了单点和容灾的问题,满足CAP理论中的CP特性,即一致性和分区容错性.ZooKeeper集群基于过半设计原则,至少有过半的机器保存了最新的数据…
说说你们的分布式ID设计方案 我们采用Snowflake算法,生成一个64bit的数字,64bit被划分成多个段,分别表示时间戳.机器编码.序号. 41位的时间序列(精确到毫秒,41位的长度可以使用69年). 10位的机器标识(10位的长度最多支持部署1024个节点). 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号). 优点: 时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序. 性能高,每秒可生成几百万ID. 可以根据自身业务需求灵活调整bit位…
ActiveMQ专题 (面试题+答案领取方式见主页) 什么是 ActiveMQ? ActiveMQ 服务器宕机怎么办? 丢消息怎么办? 持久化消息非常慢. 消息的不均匀消费. 死信队列. ActiveMQ 中的消息重发时间间隔和重发次数吗? RabbitMQ专题 RabbitMQ 中的 broker 是指什么?cluster 又是指什么? 什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布的? RAM…
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发 Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发 Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发 Keil MDK STM32系列(五) 使用STM32CubeMX创建项目基础结构 Keil MDK STM32系列(六)…
这是why技术的第38篇原创文章 又到了一周一次的分享时间啦,老规矩,还是先荒腔走板的聊聊生活. 有上面的图是读大学的时候,一次自行车骑行途中队友抓拍的我的照片.拍照的地方,名字叫做牛背山,一个名字很 low,实际很美的地方. 那条上山的路很难骑,超级烂路和极度变态的陡坡.真是一种折磨,是对意志力的完全考验. 在我们几近崩溃,弹尽粮绝,离山顶还有近两个多小时的时候,一个卡车司机主动要求把我们免费带到山顶.我们拒绝了. 因为同行的星哥他说了一句话:“骑行牛背山这件事情,我这辈子只会做这一次.现在的…
WCF编程系列(五)元数据   示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServiceClient.cs 命令中http://localhost:8000/?wsdl连接返回一个XML,该XML即为元数据:用以描述如何与服务的终结点进行交互.正因为有元数据的存在,svcutil命令才能自动生成客户端代理类. 元数据遵循Web服务描述语言(WSDL)标准,所以可被多种语言支持,除WC…
原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案的,所以本专题中将为大家介绍下Outlook相关的内容.我们从Visual Studio 2010 中Office节点下的模板中我们可以看到,Outlook只有外接程序的模板,并没有提供像Word或Excel这样的文档级的模板,所以VSTO没有为Outlook解决方案创建宿主项和宿主控件(Excel…
原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开源项目. AnkhSvn安装下载完毕后,进行安装,安装向导安装即可,如下步骤.[步骤1]安装界面,见图. [步骤2]安装成功 AnkhSvn连接VisualSvn Server 下载源项目安装成功后,打开vs2008将会产生如下菜单,见图. 如果没有此菜单,请查看工具下的选项中的source con…
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_007_scrapy01.html scrapy爬虫学习系列二:scrapy简单爬虫样例学习: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_007_scrapy02.html scrapy爬虫学习系列三:scrapy部署到scrapyh…
WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Host.Windows Service Host.当WCF编写完成后我们一般要通过这三种方式的一种发布WCF服务,当WCF服务发布后,我们就可以编写客户程序来与服务的终结点进行通信.这篇文章我们主要来介绍如何编写客户程序. 前提:1.事先建立好一个WCF服务2.使用上面任何一种方式发布WCF.在这里我们…
Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模型,但也有许多不足之处,比如我们想实现一个迷你小地图功能,对于Bing Map Silverlight Control就没有这样的内置控件.但不必费心费神的自己去开发一个这样的控件来实现这个功能,因为在DeepEarth中已经为我们提供了这样一个控件,首先看看在Bing Maps(http://cn…
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来.<CSS 魔法系列>继续给大家带来 CSS 在图形绘制中的创新使用. 您可能感兴趣的相关文章 CSS3 在网页设计中的20佳惊艳应用 推荐12个漂亮的 CSS3 按钮实现方案 推荐10个非常优秀的 CSS3 开发工具 分享50个漂亮的 CSS3 最佳应用示例 24款非常实用的 CSS3 工具终极收…
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且如何来设计项目的架构和模块,下面我们就来一步步开始吧. 本文大纲 1.Prism框架下载和说明 2.Prism项目预览及简单介绍. 3.Prism框架如何在项目中使用. Prism框架下载和说明 Prism框架是针对WPF和Silverlight的MVVM框架,这…
Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就是相关的编解码器.原本想把编解码器写在上一篇文章里面的.后来想想Netty里面的编解码器太多了.想要一次写完比较困难.于是重新开了一篇文章来专门写这个. 1.     Hello World !实例中的使用 在这里先讲一下我们第一篇文章里面的实例使用到编解码器. 1.1 DelimiterBased…
JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的JVM参数配置参考方案.正如之前文章中提到的JVM参数的设置需要根据应用的特性来进行设置,每个参数的设置都需要对JVM进行长时间的监测,并不断进行调整才能找到最佳设置方案.本文将介绍如果通过工具及Java api来监测JVM的运行状态,并详细介绍各工具的使用方法.…