Apr12

【原创】论外部接口调用的设计原则

Author: leeon  Click: 194   Comments: 0 Category: 架构  Tag: api

      今日后端系统发生一次严重的redis cpu 100%异常问题。期初是怀疑系统硬件问题,因为后端代码已经好几天没有发不过,理应是不会突然故障。于是一步步排查,首先从redis本身入手,其本身redis 占用率过高网上的说法也已经概括的比较全面了,不外乎bgsave,keys模糊查找和滥用排序导致redis性能下降。但是从我们本身的系统架构而言,redis的cpu使用率一直都稳定在3%左右,数据大小本身也不高,rdb文件本身也不大只有几百兆,占用的系统内存页也只有整个硬件内存的20%。磁盘io,cpu都很稳定, 

      首先通过strace定位的方法监控php-fpm和redis进程是否有异样,发现php-fpm都卡在和redis的通信上,而redis进程都卡在频繁读写上。info查看redis的total_commands_processed数值,尽然每秒高达20w次左右,我们知道通过redis的benchmark测试redis的性能通常每秒不走pipleline也差不多这个数值了,业务突然能将redis的吞吐能力消耗干净那肯定不外乎受外部大规模的压力攻击或系统内部的死循环导致。

   攻击肯定就谈不上了,nginx上访问日志很正常,通过redis的monitor命令查看redis的实时执行命令,发现全部都是对同一个key进行写入和查询。接着通过get这个key输出的值发现了端倪。继而定位到业务代码中的执行片断。

     问题排查到现在就好解决了,代码级定位发现了原先设计代码中不合理的设计,对于第三方外部接口调用没有采取异常情况的最终返回,导致不停的递归调用了第三方接口,但是第三方接口又因为查询条件的改变,导致始终执行不成功。这样无法缓存正常数据,就导致不停的查缓存和写缓存操作。

    通过这次问题排查和解决,总结了如何使用第三方接口服务的设计原则:

1. 不管如何设计接口切记尽量避免使用递归来请求接口,如果没有捕获到极端异常,有可能导致程序死循环。

2. 所有外部接口都要设计一个最终失败的逻辑。

3. 对第三方接口增加缓存逻辑的同时,一定要对失败的结果也做一份缓存,避免频繁请求第三方接口而导致同步io延时的问题。

4. 千万不要认为大厂的API接口都是极其稳定的,是的!今天遇到的就是百度的云API提供的接口,虽然大厂通常对自己提供的服务接口都有做API自动化测试,但是故障恢复能力并不一定每个业务团队都能及时响应。更不要以为大厂的开发们都是各个经验丰富,知道如何保证API的可用性和稳定性。如果哪天他们升级了代码将接口的传参做了调整,这种对调用方的伤害也是巨大的。一个设计合理的接口一定遵循一点,同版本接口输入和输出必须保证确定性,做了调整的接口一定得区分版本号。

Mar31

【原创】关于elasticsearch中拼音搜索的性能问题

Author: leeon  Click: 268   Comments: 0 Category: 架构  Tag: elasticsearch,拼音

近日在elasticsearch按照网上的教程添加拼音支持后发行搜索性能衰减非常大,以前几百万的数据搜索关键字也只需要三四是毫秒,加入了多字段的拼音支持后搜索指定字段性能衰减了6-8倍。类似于网上的配置如下:

在索引分词器中配置如下:

[code="plain"]
index.refresh_interval: 1s
index:
analysis:
tokenizer:
my_pinyin:
type: "pinyin"
first_letter: "none"
padding_char: ""
analyzer:
ik_syno:
type: custom
tokenizer: ik_max_word
filter: [my_synonym_filter]
ik_syno_smart:
type: custom
tokenizer: ik_smart
filter: [my_synonym_filter]
pinyin_analyzer:
tokenizer: my_pinyin
filter: ["word_delimiter","my_ngram"]
py_analyzer:
tokenizer: my_pinyin
filter: ["standard"]
filter:
my_synonym_filter:
type: synonym
synonyms_path: analysis/synonym.txt
ignore_case: true
my_ngram:
type: "nGram"
min_gram: 2
max_gram: 5

[/code]

[code="plain"] {
"folks": {
"properties": {
"name": {
"type": "multi_field",
"fields": {
"name": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"analyzer": "pinyin_analyzer",
"boost": 10
},
"primitive": {
"type": "string",
"store": "yes",
"analyzer": "keyword"
}
}
}
}
}
}
[/code]

这种模式配置的字段映射会极大的降低搜索性能,如果想用拼音搜索关键字建议单独设立一个独立的字段来做,不要用multi_field复合字段的方式来配置,这样会大大降低在指定字段中搜索的性能,我猜测如果使用nGram方式来生成分词,会导致生成的token非常多,导致搜索匹配的数据太多导致查询太慢。

Mar22

【原创】elasticsearch使用analyze时出错问题

Author: leeon  Click: 228   Comments: 0 Category: 架构  Tag: elasticsearch,analyze,analyzer

在使用elasticsearch-rtf 2.2.0版本时使用analyze命令测试配置的自定义分词器是否生效,结果运行后日志报错,我测试的url命令如下:

http://10.0.18.123:9200/_analyze?text=中文测试&analyzer=ik_syno

[code="plain"]
[ERROR][transport ] [Cassiopea] failed to handle exception for action [indices:admin/analyze[s]], handler [org.elasticsearch.action.support.single.shard.TransportSingleShar[email protected] ]
java.lang.NullPointerException
at org.elasticsearch.action.support.single.shard.TransportSingleShardAction$AsyncSingleAction.perform(TransportSingleShardAction.java:195)
at org.elasticsearch.action.support.single.shard.TransportSingleShardAction$AsyncSingleAction.access$700(TransportSingleShardAction.java:115)
at org.elasticsearch.action.support.single.shard.TransportSingleShardAction$AsyncSingleAction$1.handleException(TransportSingleShardAction.java:174)
at org.elasticsearch.transport.TransportService$DirectResponseChannel.processException(TransportService.java:821)
at org.elasticsearch.transport.TransportService$DirectResponseChannel.sendResponse(TransportService.java:799)
at org.elasticsearch.transport.TransportService$4.onFailure(TransportService.java:361)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:39)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[/code]

查询google得知为最新的bug一枚,https://github.com/elastic/elasticsearch/pull/15447 ,做个记号。测试的时候需要在设置的索引上运行analyze来避免这个bug被触发。

http://10.0.18.123:9200/indexName/_analyze?text=中文测试&analyzer=ik_syno

May12

【原创】Jenkins整合git问题记录

Author: leeon  Click: 2485   Comments: 0 Category: linux  Tag: git,jenkins

今日整合git到jenkins是遇到一个极其坑爹的问题,在工程中添加git地址同时配置连接用户名和密码后,老是提示类似如下错误

Failed to connect to repository : Command "git config --local credential.helper store --file=/tmp/gitXXXXXXXXXXXXXXXXX.credentials

我在jenkins中用的git版本是centos6.3自带的1.7的版本,导致jenkins始终不能正常执行git参数,故升级git版本到最新版本后问题解决。请注意就算使用jenkins自带的插件中的git版本也有可能遇到类似问题,请自行编译安装最新版本的git即可,btw我现在用的版本是git-2.4


分类

标签

归档

最新评论

小甲虫在18:05:31评论了
shell中使用while循环ssh的注意事项
中传视讯在12:29:44评论了
【原创】武汉互联网公司介绍[2016年1月更新版]
肆月在17:06:20评论了
【原创】 APK增量升级架构设计分享
SorXD在00:10:08评论了
【原创】武汉互联网公司介绍[2016年1月更新版]
907494867#qq.com在14:42:59评论了
【原创】使用pcap.net在windows下实现自定义的抓包分析工具

我看过的书

链接

其他

访问本站种子 本站平均热度:5085 c° 本站链接数:27 个 本站标签数:400 个 本站被评论次数:82 次