Architecture

理解Zookeeper的Connection和Session之间的关系

可以通过比较CONNECTION_LOSS和SESSION_EXPIRED这两种错误,来理解Connection和Session之间的关系:   官方释义 底层本质 跟CONNECTION_LOSS的关系 跟SESSION_EXPIRED的关系 重连 连接保持机制 CONNECTION_LOSS link broken TCP短连接超时? 或长连接心跳失败? (待看代码) N/A 如果在SESSION Timeout到期之间重连成功,则无SESSION EXPIRED; 否则,则意味着SESSION_EXPIRED ZK客户端自动重连 tcp keepalive机制? (待看代码) SESSION_EXPIRED "partitioned"for more than the session timeout 应该跟底层无关(待看代码) 很有可能是由CONNECTION_LOSS导致的 N/A 客户端自己决定是否重连 ping心跳

zookeeper锁的不可靠性

假设两个client竞争一个锁,拿到锁的client有资格处理指定的资源。系统的设计目标是同一时刻只有一个client在处理资源。 假设当前client1拿到锁了,client2等待中。 client1正在处理指定资源。 这时client1断开,client2拿到锁,开始处理指定资源;但由于client1并不知道自己已经断开了,所以会继续处理资源,结果造成两个client都在处理同一个资源。 解决办法是每个client在处理时要时不时地轮询自己跟zk是否已经断开连接。 见: http://stackoverflow.com/questions/14275613/concerns-about-zookeepers-lock-recipe

消息中间件必须提供ack()机制

ack()机制 = 当消费者消费完消息、并回送ack()后,消息中间件才能认为此消息已被成功消费。 无ack机制 = 消费端拿到消息后,中间件就认为消费端已成功处理 在“ACK机制”下,如果消费端在拿消息A后出异常或者当机,当它从异常或当机中恢复时,又于出错前没有回送ACK,消息中间件就会重发消息,消费端就有了一次补偿处理的机会。 在“无ACK机制”下,就没有补偿处理的机会,也就会造成数据的不一致。

solr用zookeeper来干什么?

SolrCloud是solr服务器的集群,它需要zookeeper来:     1.同步配置文件     2.在集群间做状态协调 "SolrCloud uses ZooKeeper to synchronize configuration and cluster states (such as elected shard leaders)" 细节待续。。。

小结:预发布测试时如何隔离生产环境的应用

对系统进行预发布测试时,应该保证不会触碰到生产环境中系统的应用,否则你测的对象就不是预发服务器了。 1.用浏览器访问预发web应用:   通过改写浏览器端hosts,把正式域名指向预发服务器。 2.一个预发系统以RPC方式调用另一个预发系统:   如果有注册中心、有服务发现机制,则可以让RPC服务提供者以特殊的版本号在预发环境发布,服务使用者在预发环境用这个版本号访问它。   如果没有服务发现机制,就把服务提供者的预发环境IP告诉服务使用者 3.一个预发系统发异步消息给另一个预发系统:   预发系统搭建自己的消息中间件服务器   4.期望测试时造的数据只被预发的task (如quartz) 访问到     这个比较难,因为预发系统和生产环境一般共享同一套数据库,预发环境造的数据也会被生产环境的task访问到。这时一般要在表里为预发用的数据专门开设一个标志位字段,如果有多张表,可能每张表都需要这样的字段;再在应用代码里判断当前数据是否是预发数据;这种做法很繁琐,而且直接侵入了系统。

solr里要使用FastVectorHighlighter时须使用的配置和代码

schema.xml里配置term位置信息 <field name="text" type="text_en_splitting_tight" indexed="true" stored="true" multiValued="false" [b] termVectors="true" termPositions="true" termOffsets="true"[/b] /> 如果使用了比较智能的分词,则要在solrconfig.xml里配置breakIterator <boundaryScanner name="breakIterator" default="true" class="solr.highlight.BreakIteratorBoundaryScanner"> <lst name="defaults"> <!– type should be one of CHARACTER, WORD(default), LINE and SENTENCE –> <str name="hl.bs.type">SENTENCE</str> <!– language and country are used when constructing Locale object. –> <!– And the Locale object will be used when getting instance …

solr里要使用FastVectorHighlighter时须使用的配置和代码 Read More »