
s2: 软件设计
涛歌依旧
毕业后就职于华为和腾讯
展开
-
详解事务、隔离级别、悲观锁和乐观锁
今天,我们来聊数据库事务ACID、隔离级别、悲观锁和乐观锁。无论是在工作中,还是在笔试面试中,数据库相关的问题,总是绕不开,不会的话,很容易歇菜,你懂的。数据库事务场景在银行系统中,数据库事务是必须的。在电商系统中,也是如此。来看下A给B汇款100元的例子,可以看到,A账户扣款100元,此时如果进程崩溃或者机器掉电,那么这100元就没有加到B的账户中,自然会导致用户的强烈投诉:如果先给B账户加钱,然后给A账户扣钱,会怎样呢?可以看到,此时如果进程崩溃或者机器掉电,银行白白给B加了原创 2021-08-14 12:43:35 · 958 阅读 · 0 评论 -
动态配置的缓存方案
假设有这样一个问题: 微信有10亿用户,不可能对所有用户的所有操作都打印log(最多只能打印错误log), 现在,微信内部领导经常反馈问题,没有log就不能查问题, 该怎么办? 如果普通用户反馈问题呢, 怎么查? 提示: 1. 白名单 2. 动态配置, 利用缓存 ...原创 2018-03-21 22:21:56 · 5076 阅读 · 1 评论 -
戏说消息队列的利弊
转载地址:https://www.zhihu.com/question/34243607什么是消息队列?小红是小明的姐姐。小红希望小明多读书,常寻找好书给小明看,之前的方式是这样:小红问小明什么时候有空,把书给小明送去,并亲眼监督小明读完书才走。久而久之,两人都觉得麻烦。后来的方式改成了:小红对小明说「我放到书架上的书你都要看」,然后小红转载 2018-01-29 20:46:56 · 8889 阅读 · 8 评论 -
什么是分布式数据库中的CAP理论(容易误解)?------内附CAP原则下的常用数据库
网上有很多关于CAP理论的介绍, 感觉很多文章没有说清楚, 本想写一篇文章来介绍一下, 但我发现wiki上的介绍更好, 所以直接引用过来(红色的中文是我的注解):Intheoretical computer science, theCAP theorem, also namedBrewer's theoremafter computer scientistEric B原创 2018-01-24 22:26:41 · 8943 阅读 · 1 评论 -
linux(ubuntu)下安装和启动kafka以及若干坑
今天来玩玩kafka, 有点意思。 1. 下载二进制的kafka安装包, 地址:http://kafka.apache.org/downloads.html, 以kafka_2.10-0.9.0.0.tgz为例吧, 下载后, 如下:ubuntu@VM-0-13-ubuntu:~$ lskafka_2.10-0.9.0.0.tgz share原创 2017-11-24 19:47:54 · 17630 阅读 · 2 评论 -
后台开发、运维监控系统要怎么搞?
后台开发、运维监控系统要怎么搞? 上报参数包括维度和指标。 于是乎, 哪里出了问题, 就一目连然了。原创 2017-12-23 12:29:55 · 9269 阅读 · 9 评论 -
MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什么特点?
转自:https://www.cnblogs.com/findumars/p/4204416.htmlWTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码过于复杂,编译太慢,出错不好调试等问题难以解决。而且封装得也不转载 2017-12-13 23:33:58 · 7659 阅读 · 2 评论 -
数据库连接池的好处
转载地址:http://yplsoft.iteye.com/blog/156697 注意: 红色字体是我加的。 对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关闭连接,会极大的转载 2017-11-30 22:39:43 · 9782 阅读 · 0 评论 -
rapidjson串组装的代码示例
我们知道json串的格式, 那么组装json不就很容易吗? 恩, 但是, 如果我们自己组装, 遇到特殊字符会有坑, 而且, 代码看起来恶心, 不信? 来看看:#include #include #include#include #include #include #include// 请自己下载开源的rapidjson#include "rapidjson/prettywri原创 2017-09-30 20:15:48 · 7574 阅读 · 1 评论 -
整死你个妖精,CDN西游捉妖记!
转载地址:http://www.sohu.com/a/26576175_208510CDN的降价潮和撕逼季已过,终于轮到小黑羊来做个科普啦。这事儿,要从西游记取经开始……[本图来自肖传湛个人网站:www.moko.cc/hiyoko]1300年前,唐僧师徒取经要跋涉十万八千里,历经九九八十一难,一路打怪升级,最终才能修成正果,悟空加冕“斗战胜佛”转载 2017-09-20 23:19:39 · 7460 阅读 · 0 评论 -
常见I/O的访问时间scale
了解I/O的访问时间很有好处。 我们都会把基本的字符串处理做成库或者函数, 供程序调用。你见过把字符串处理单独做成一个网络server吗? 我见过, 也用过。根据实际测试结果, 同城IDC之间, 往返网络迟延一般在10ms以内, 很快了。根据对这个字符串server进行监控,发现往返网络迟延+字符串server的处理时间, 总共才3-5ms. 某次,我把深圳对深圳的...原创 2018-03-24 11:03:51 · 5266 阅读 · 0 评论 -
腾讯专家分享:腾讯做业务监控的心得和经验
转载地址:http://www.qcloud.com/blog/?p=497 分享主题: 腾讯业务立体化监控体系 1.介绍腾讯业务监控体系的层级构成;2.用代表性的监控系统阐述每个监控层次的实现方法;3.与监控体系配合,业务做了哪些容灾和调度的方案。 分享实录: 首先很荣幸在这里给大家分享腾讯在做业务监控的一些心得和经验,当然今天所提及的只是腾讯业务运营监控体系中的...转载 2018-05-13 09:42:44 · 9803 阅读 · 2 评论 -
数据库分库分表思路
转载地址:https://www.cnblogs.com/butterfly100/p/9034281.html一. 数据切分关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负...转载 2019-08-30 22:56:02 · 3154 阅读 · 1 评论 -
利用“异步确保模式”实现最终一致性
很多时候, 有这样一种场景: A系统需要把信息通知给B系统(例如支付系统中的入账操作), 需要保证通知消息一定成功, 且相对均匀地推, 怎么搞呢? 异步重试法就可以轻松搞定, 实现起来很简单, 关键是思路: 不多说。...原创 2019-07-13 17:34:35 · 3064 阅读 · 4 评论 -
再遇幂等性
用户确认收货, 逻辑涉及到如下步骤:func confirm_order() { err := update_system1() if err != nil { return } err = update_system2() if err != nil { return } call_other_system()} 实际发现, up...原创 2019-06-02 12:04:26 · 2335 阅读 · 2 评论 -
用mysql实现分布式锁
考虑这样一个场景: 多台机器同时执行某一任务,要求某一时刻最多只有一台机器执行, 该怎么搞呢? 可以考虑分布式锁。 思路:在mysql中插入一条记录,表明获取锁。删除一条记录,表明释放锁。 且在mysql表中设置一个unique key字段, 当有一台机器获得锁后, 其他机器无法获取。 有几个问题: 1. 如...原创 2018-12-01 22:32:11 · 8286 阅读 · 13 评论 -
重放攻击与幂等性------从最近被重复扣款26元说起
本周二, 去外面吃了个饭, 扫码点餐,微信支付, 成功付款26元, 但页面提示失败, 且提示让我稍等, 不要尝试继续支付。 等了一会儿,没有结果。 店里人很多, 没来得问是什么情况, 就再次支付了, 第二次成功。当我查看微信支付记录的时候, 发现扣款两次了。 1分钟后, 另外一个吃饭的人, 也反馈了这个问题, 我们找老板反馈, 老板同意退钱, 甚好。 其实, 这种重复扣款的问题, 是...原创 2018-07-22 15:04:52 · 5915 阅读 · 2 评论 -
巧用CAS解决数据一致性问题
转载地址:https://www.cnblogs.com/sheldon-blog/p/8109900.html 缘起:在高并发的分布式环境下,对于数据的查询与修改容易引发一致性问题,本文将分享一种非常简单但有效的优化方法。 一、业务场景业务场景为,购买商品的过程要对余额进行查询与修改,大致的业务流程如下:(1)从数据库查询用户现有余额 SELECT mone...转载 2018-07-22 12:01:16 · 4295 阅读 · 2 评论 -
map,hash_map和unordered_map效率比较
转载地址:https://blog.youkuaiyun.com/whizchen/article/details/9286557 原理介绍map介绍map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道...转载 2018-08-03 21:53:15 · 14565 阅读 · 4 评论 -
关于全局唯一id的一些思考
在实际工作中,经常会涉及到生成全局唯一id的问题, 比如用户id,比如某个分享动作的id, 当然, 还有其他更多的情形。本文简单聊一下。 方案一: 利用数据库自增序列 这种方案我在实际开发中用过好几次, 在mysql中,可以设置一个自增字段, 每次insert一条后, 都会生成一个自增的id. 优点: 寄托于数据库, 简单, 而且id自...原创 2018-07-28 15:43:43 · 4883 阅读 · 1 评论 -
软件许可证的设计思路
今天, 我们来考虑这样一个问题: 你写了一个软件tool.exe, 别人想买, 需要花1块钱, 然后你把tool.exe发给他, 他就是你的用户了。 问题是: 你怎么防止tool.exe被无限复制和传播呢? 这样岂不是就挣不到钱呢? 这就涉及到软件许可证的控制了。 你看, 我们平常用的一些软件, 经常需要搞个验证码什么, 就是类似的道理。 这里, 我们考虑原创 2017-09-16 08:10:21 · 18955 阅读 · 9 评论 -
https简介以及仿https的加密tcp安全通道的简要设计思路
今天, 我们来说说https, 也就是安全的http. 怎么个安全法? 那肯定是要对传输的数据进行加密, 为了效率, 我么可以考虑用对称加密算法, 如典型的AES. 那么问题来了, 客户端和服务端怎样才能拥有相同的对称秘钥key呢? 显然, 可以考虑从客户端端随机生成一个秘钥, 然后传递了服务端, 这不就行了吗? 是的。 但是, 传递这个秘钥的过程, 是一原创 2017-09-15 20:30:37 · 8679 阅读 · 1 评论 -
定时系统“同时”之坑------理论可行, 实际不一定行; 理论不可行, 换个思路,实际可能会行!
某次, 遇到安全问题, 需要改造技术方案。 两条逻辑捆绑的消息被强行拆开, 由cgi设置一个相同的时间, 两条消息分别带着相同的时间戳进入定时系统。 定时系统在时间戳对应的时间点将两条消息同时转发, 预期同时达到另外一端。 如图: 然后, 大坑就来了。 定时系统是个比较复杂的系统, 消息m1和m2进到定时系统后, 就像两原创 2017-03-25 01:35:52 · 7359 阅读 · 1 评论 -
浅谈dispatcher层------内附详图
假设如下是一个写数据流程, 从用户那里过来的数据, 经接入层到了逻辑层, 然后到了存储层, 然后就往数据库中写数据了, 然后把写的结果逐步逆向返回给用户: 大家可以看看, 这里可能有什么问题? 这个写操作经常是一个比较重的操作, 用户必须苦苦等待最终结果, 那怎么优化? 想想生活中的各种场景吧: 你去办身份证, 经历了大厅的接待人员, 来到窗口提交各种手续,原创 2016-04-17 09:27:36 · 7929 阅读 · 0 评论 -
典型的错误码和错误信息匹配代码------本质就是key value匹配
在实际开发中, 经常设计错误码和错误信息, 这么来搞吧:#include #include using namespace std;enum{ ERR_XXX1 = -10001, ERR_XXX2 = -10002,};typedef struct _ErrMsg{ int errCode; char szStrMsg[256];}ErrMsg;ErrMsg原创 2016-04-04 22:38:53 · 8392 阅读 · 0 评论 -
学会利用“配置文件”优化我们的代码结构
之前我们讲过某些时候可以利用数组来代替if/else来优化代码, 在本文中, 我们再次来复习一下, 顺便学学利用配置文件来优化代码结构, 好, 开始吧。 假设有这样一个场景: 某系统会产生三类错误, 分别是:ERROR_TYPE_ONE,ERROR_TYPE_TWO,ERROR_TYPE_THREE. 但是呢, 各省份有不同的需求, 比如: 1. 安徽省要原创 2015-03-13 23:40:35 · 8327 阅读 · 2 评论 -
软件使用权的控制---C/C++代码的实现
有时候, 自己写了一个软件, 放到网上, 大家都可以使用。但是, 如果要控制别人的使用权, 该怎么办呢? 在本文中, 我们用一个极其简单的例子来说明控制机制。 当然, 如果你的软件写得够好, 有很大的客户需求, 搞一个使用权的控制机制, 说不定可以小小地赚一笔钱呢 我们把这个软件的名称定为Beauty.exe吧, 其源码是(为了简便起见, 魔鬼数字我就不替换成宏了):原创 2014-11-29 20:48:27 · 19895 阅读 · 9 评论 -
结构体数组做映射(写了个风格还算靠谱的程序, 欢迎大家找茬拍砖, 共同进步)
之前说过了, 数组的本质就是映射, 下面, 我们看看更高级的映射---利用结构体原创 2014-11-22 01:04:04 · 9569 阅读 · 2 评论 -
如何在程序中加载各个模块(也谈C++多态的威力)
在一个大型项目或工程中,原创 2014-11-07 21:08:02 · 8168 阅读 · 3 评论 -
再谈函数指针/回调函数的用途------基础类如何调用主调模块
最近看一个网络库的源码, 其中涉及到TCP的收包, 我们都知道, tcp收包的时候, 要处理好粘包问题, 也就是说, 在网络基础库中, 要判断收包的完整性。 而收包是否完整, 这是由应用程序逻辑来决定的, 此时, 就涉及到基础库调用主调模块呢? 怎么搞起呢? 利用函数指针, 把待调的函数的指针告诉基础库, 基础库处理的时候,调用函数指针就行了, 这样就OK了。原创 2017-06-30 23:46:42 · 7082 阅读 · 1 评论 -
用一个日历程序来诠释top-down design和bottom-up implementation
这是多年前写的一个小程序(一个简单的日历),挺有意思的,当年就是靠这个小程序搞懂了top-down design和bottom-up implementation. 程序如下:#include#include// 用了windows.h就不要用自定义的BOOL(而用MY_BOOL)// 否则冲突.typedef enum{MY_FALSE, MY_TRUE} MY_BOOL原创 2012-12-06 19:53:54 · 8539 阅读 · 1 评论 -
如何为一段buffer带上一个头?
学过数据结构的朋友们都应该知道, 在链表中有头结点这一说法, 它是不同于第一结点的。 可以这里理解, 头结点是非业务结点, 而其他结点是业务结点。 很多时候, 我们要在一段buffer前套一个头, 这个头中有这个buffer(或者整个带头buffer)的长度信息, 当然也可以带其他信息。 这是很普遍的。 想想我们的网络协议, 不就是层层加头吗? 当然, 你也可以加尾。原创 2017-03-25 09:09:19 · 7429 阅读 · 0 评论 -
扯淡冷热数据------顺便谈谈高效阶乘
什么叫热数据呢? 热数据就是经常访问的数据。在学生时代, 每次考试, 我们都需要记住大量的公式, 而为什么不每次考试的时候去现场推导公式呢? 因为耗时。 在这个例子中, 公式就是热数据, 直接获取热数据, 可以省很多时间。 人人皆知。然而, 人的记忆能力和精力毕竟是有限的, 对于一些偏门的、万年碰一次的冷门公式, 其实是不必要记忆的, 万一遇到, 会推导即可, 这种数据就是冷数据。原创 2016-05-21 00:03:30 · 8824 阅读 · 4 评论 -
缓存的本质是什么?
缓存的本质是让热数据接近目的地, 用简单程序结束本文:#include int a[100] = {0}; // 缓存int jieCheng(int n){ if(0 == n || 1 == n) { a[n] = 1; return a[n]; } if(0 == a[n]) { a[n] = n * jieCheng(n - 1); return a原创 2016-06-20 23:30:52 · 7870 阅读 · 5 评论 -
新搭建后台server服务? oh no!------程序员的脑力劳动和体力劳动
我觉得程序员的劳动分为两种------脑力劳动和体力劳动, 如果脑力劳动不过关, 那么随后的体力劳动就很繁重啊, 而且会吃力不讨好, 脑力劳动是没法靠加班来解决的!所以呢, 诸如方案涉及, 代码设计这类工作, 还是要仔细认真思考, 全局考虑, 先把流程打通, 说白了, 就是能清晰地看清这条路, 然后花时间去走就行了。 至于后面的实现, 就是相对简单的事情了, 无非就是码代码, 这是个体力劳动, 花原创 2017-03-05 10:58:05 · 7996 阅读 · 5 评论 -
某定时任务系统的方案设计------软件系统设计能力很重要
来看这样一个问题: 某账号系统的账号都在unsigned int内, 也就是0-42亿左右。 在这42亿账号中, 有大约1亿账号是相对非常活跃的用户, 用户和用户之间可以建立好友关系(类似于微信那样的好友关系)。 现在要设计一个定时赠言系统, 比如: 今天是2017年3月25日, 那么用户A可以给他的好友B送定时赠言(精确到未来某天, 不包括今天), 预期未来这天到达。而原创 2017-03-25 11:42:24 · 10947 阅读 · 4 评论 -
Cache(缓存)和 Buffer(缓冲),主要区别是什么?
转载地址:https://www.zhihu.com/question/26190832俩英文单词,不先看看本义吗?虽然都是抽象单词,但在各个地方都有具象的应用。Buffer常见的是这个:<img src="https://pic4.zhimg.com/v2-b7b66d782898210d7bd22439e9238d转载 2017-04-04 01:59:45 · 17908 阅读 · 0 评论 -
为什么w要找s做经纪人?------聊聊软件系统中agent的构思与作用
我们都知道, w找了s做经纪人。 基于这个陈述句, 我们要问: 1. w是谁? 他是电影明星, 老实巴交, 是很多人的偶像。 2. s是谁? 他是w的经纪人, 那什么是经纪人呢? 在英文里面, 就是agent, 说的俗点, 就是个代理人, 如果你要理解为跑腿(不是抱腿)的, 那也可以。 3. w为什么原创 2017-04-04 02:06:42 · 8493 阅读 · 3 评论 -
又是缓存惹的祸!!!
最近遇到这样一个问题: 客户端请求服务端, 服务端没有给客户端返回相关的字段信息(抓包确认的), 但客户端却获取到了信息, 怪哉! 抓包是比较靠谱的, 它体现了最原始的网络交互。 抓包没有就是没有。但: 1. 客户端却有了对应的信息. 2. 代码也有对应字段的回传信息。 好矛盾啊! 原来, 客户端有缓存逻辑!!!!!!原创 2016-11-05 15:53:39 · 7057 阅读 · 1 评论 -
无协议情况下的反序列化
以gpb为例, 我们可以写出.proto协议文件, 然后进行序列化。 收到buffer后, 又根据协议进行反序列化。 其实, 序列化本身就是一个固有的算法, 对于序列化后的buffer, 完全不需要协议, 就可以解析出原内容。 这样我想到了h.264的解码,去理解每一个bit, 有点类似。 哈哈。原创 2016-09-15 12:38:36 · 7772 阅读 · 0 评论