随笔分类 -  编程

摘要:前言 对于现在拥有大流量的互联网平台来说,一个微小的页面改版或者是一个微小的后台内容推荐模型参数的修改都会产生非常大的影响,如何安全的在线上流量验证这些改进是否真有助于提高公司的收益或者是用户的体验呢? A/B Test 很容易想到做A/B Test,我们可以用一种方式把全网流量分成100份,取其中 阅读全文
posted @ 2018-10-30 11:05 haolujun 阅读(4714) 评论(4) 推荐(3) 编辑
摘要:前言 前一篇文章 "《RabbitMQ和Kafka到底怎么选?》" ,我们在吞吐量方面比较了Kafka和RabbitMQ,知道了Kafka的吞吐量要高于RabbitMQ。本文从可靠性方面继续探讨两个队列的差异。 RabbitMQ可靠性 我们通过前文知道,RabbitMQ的队列分为master que 阅读全文
posted @ 2018-09-14 11:04 haolujun 阅读(8444) 评论(5) 推荐(5) 编辑
摘要:前言 我最近一直在公司做检索性能优化。当我看到这个算法之前,我也不认为我负责的检索系统性能还有改进的余地。但是这个算法确实太牛掰了,足足让服务性能提高50%,我不得不和大家分享一下。其实前一段时间的博客中也写到过这个算法,只是没有细讲,今天我准备把它单独拎出来,说道说道。说实话,本人数学功底一般,算 阅读全文
posted @ 2018-08-24 09:39 haolujun 阅读(13732) 评论(52) 推荐(41) 编辑
摘要:为啥需要更换RPC? 很多小伙伴都遇到过需要为分布式系统调用更换RPC的问题,为什么会遇到这种事呢?其实,在系统搭建初期,需求简单,架构简单,最重要的是请求量也少,所以很多系统都采用快速原型开发模式,对rpc的要求不高,随便找一个顺手的或者熟悉的rpc框架套进系统中即可。但是随着业务复杂度增高,系统 阅读全文
posted @ 2018-04-25 10:04 haolujun 阅读(4424) 评论(2) 推荐(6) 编辑
摘要:前言 boost::bind操作想必大家都使用过,它特别神奇,能够绑定函数与参数,绑定后能够改变参数数量,并且还可以使用占位符。它可以绑定普通函数也可以绑定类成员函数。好多小伙伴试图看过boost::bind的源码,但是可能效果不佳。原因在于boost::bind的代码考虑了很多使用情况,而且还要兼 阅读全文
posted @ 2018-04-16 10:15 haolujun 阅读(1476) 评论(0) 推荐(0) 编辑
摘要:背景 最近工作中遇到了一个问题:如何对大规模题库去重?公司经过多年的积累,有着近亿道题目的题库,但是由于题目来源不一导致题库中有很多重复的题目,这些重复的题目在检索时,除了增加搜索引擎的计算量外,并不会提高准确率。此外由于题目过多,搜索引擎往往采取了截断策略,只对一部分题目进行计算,这导致了某些正确 阅读全文
posted @ 2018-02-09 18:10 haolujun 阅读(7698) 评论(19) 推荐(40) 编辑
摘要:搜索引擎如何工作? 信息检索已经发展的非常成熟了,应该所有人都不陌生。我有幸这几年接触过并且实际做过一些搜索引擎开发的工作,特此总结并分享给大家。实际上,一个成熟的搜索引擎是想当复杂的,比如百度的,就分nginx,vui,us,as,bs,da.....等等这些模块,当然这些简写的字母大家也不必了解 阅读全文
posted @ 2018-01-18 10:08 haolujun 阅读(4633) 评论(1) 推荐(2) 编辑
摘要:背景 随着队列技术越来越成熟,很多公司都把MQ放入其技术栈中,线上也基本都运行着该组件。接下来我们一起讨论下,当使用MQ后,你该如何分析线上问题?这里给出两个名词解释,“推”:指常用的RPC调用,“拉”:使用队列进行消息传递。 示例架构 如上图一个普通的服务架构,图中有多个要素,下面对这几个要素进行 阅读全文
posted @ 2018-01-04 09:52 haolujun 阅读(1297) 评论(4) 推荐(4) 编辑
摘要:背景 今年开发了好多服务,着实踩了不少的坑。这不,分分钟就被探活搞的死去活來。这里我把这些经验分享给大家,避免大家再继续犯这种错误。 通用tcp探活原理 其实,探活原理特别简单,只要稍懂计算机网络就能够理解。 检测端 发起tcp三次握手,建立新连接,连接建立成功代表服务活着,建立失败代表服务死了,之 阅读全文
posted @ 2017-12-26 10:06 haolujun 阅读(11137) 评论(19) 推荐(17) 编辑
摘要:前言 今年一直在做的事情就是成本优化,今天分享的是如何打造一个弹性可伸缩服务。 why? 为什么需要弹性伸缩? 一个网站,通常流量大小不是每时每刻都一样,有高峰,有低谷,如果每时每刻都要保持能够扛住高峰流量的机器数目,那么成本会很高。一个诱人的想法就是根据流量大小自动调节机器的数量,这就需要我们开发 阅读全文
posted @ 2017-12-21 10:17 haolujun 阅读(6600) 评论(18) 推荐(19) 编辑
摘要:前言 工作以后很少用到算法,时间长了脑袋也不灵活。但是最近,我有幸在工作中又开始用到算法,这使我欣喜若狂,这两个算法主要用在计算文本相似度的场景中。小伙伴看标题中的“最长公共子序列”和“最小编辑距离”算法想当然都认为是烂大街的算法了,有什么好讲的。当然那种朴素的$ O(N^{2}) $的算法本文不去 阅读全文
posted @ 2017-12-20 16:59 haolujun 阅读(3544) 评论(2) 推荐(2) 编辑
摘要:前言 对于跳表,我想大家都不陌生吧,这里不多解释,感兴趣的小伙伴可以看我的这篇文章:http://www.cnblogs.com/haolujun/archive/2012/12/24/2830683.html。 这段时间在做我们拍搜的优化,今天我就讲讲我是如何用跳表优化检索系统的。 搜索引擎的夹角 阅读全文
posted @ 2017-12-11 09:48 haolujun 阅读(3067) 评论(0) 推荐(3) 编辑
摘要:想知道如何对TB级的日志进行压缩么?想知道其中会有哪些坑么?想知道如何针对具体情况进行实际优化么?本文会给你一个满意的答案! 阅读全文
posted @ 2017-09-27 10:03 haolujun 阅读(1879) 评论(2) 推荐(3) 编辑
摘要:背景 公司使用阿里的云主机部署计算型的服务,就是特别耗cpu的那种。使用过程中有一件事情很苦恼,那就是云主机的性能是不一致的,机器间的性能可相差30%,更严重的是由于是共享云主机,经常在晚上8点钟左右(各大网站的高峰期)有某些机器的系统cpu突然飙高(原因是一次系统调用消耗突然增加,系统cpu能飙到 阅读全文
posted @ 2017-09-22 16:56 haolujun 阅读(3997) 评论(8) 推荐(4) 编辑
摘要:前言 本篇文章讲述客户端与服务端的具体设计细节。有细心的小伙伴发现,客户端和服务端的工作方式不一样:服务端是多线程计算模型,利用工作线程完成数据的读取,而客户端是单线程(利用Reactor线程完成数据的读取)。这么做的原因有二:首先我们认为我们的使用RPC的初衷是由于CPU计算是瓶颈,不得已把计算放 阅读全文
posted @ 2017-09-21 17:17 haolujun 阅读(693) 评论(0) 推荐(0) 编辑
摘要:为什么需要序列化和反序列化? 假设你是客户端,现在要调用远程的加法计算服务,你与服务端商定好了发送数据的格式:发送8个字节的请求,前4字节是第一个数,后4字节是第二个数,服务端读取数据的时候也按照商定的方式读取。其实,这就是一个序列化和反序列化的过程。序列化:2个数字变成8个字节数据,反序列化:8个 阅读全文
posted @ 2017-09-21 17:16 haolujun 阅读(715) 评论(0) 推荐(1) 编辑
摘要:前言 这篇文章主要介绍整个框架用到的最核的一个设计模式:反应器模式。这个设计模式可以在《面向对象的软件架构》中详细了解,没有这本书的小伙伴不要急,我通过咱们的SimpleRpc来告诉大家这个设计模式是如何运用的。之所以它叫反应器模式,是因为它是处理事件的一种比较优美的框架。如何优美,我们慢慢道来。 阅读全文
posted @ 2017-09-21 17:16 haolujun 阅读(1051) 评论(0) 推荐(0) 编辑
摘要:系统边界 什么是系统边界?系统边界就是在系统设计之初,对系统所要实现的功能进行界定,不乱添加,不多添加。这么做的好处就是,系统简单明了,主旨明确,方便开发和用户使用。举个例子,一个自动售货机的本职工作是自动售货,用户投入零钱,选择商品,出货,找零,功能简单明了。但是,工程师非要再给售货机添加一个播放 阅读全文
posted @ 2017-09-21 17:09 haolujun 阅读(1473) 评论(0) 推荐(0) 编辑
摘要:想自己动手实现一个RPC么?想只用一天就能理解RPC的设计核心么?本文列出了设计一个RPC设计时考虑的四大主要问题,并且自己实现了一个1000余行代码的RPC框架,欢迎交流探讨。 阅读全文
posted @ 2017-09-21 17:07 haolujun 阅读(2254) 评论(6) 推荐(2) 编辑
摘要:注:本文部分内容来源于<<操作系统概念>>第六版,[美]Abraham Silberschatz,Peter Baer Galvin,Greg Gagne著,郑扣根译。如有错误,还望大家批评指正,我先谢过大家了。锁是为了解决某种资源(又有人称临界资源)互斥使用提出的一种机制。常用的有读写锁、互斥锁、自旋锁。接下来就谈谈这个自旋锁。自旋锁和互斥锁功在使用时差不多,每一时刻只能有一个执行单元占有锁,而占有锁的单元才能获得临界资源的使用权,从而达到了互斥的目的。自旋锁与互斥锁的区别在于:自旋锁在执行单元在获取锁之前,如果发现有其他执行单元正在占用锁,则会不停的循环判断锁状态, 阅读全文
posted @ 2013-03-02 15:56 haolujun 阅读(6778) 评论(0) 推荐(0) 编辑