记年前一次坑爹的联调记录 看看日期,马上过春节了。年前的任务很简单,就是联调。快过春节了,懂的都懂,大多数人心里都想着回家。结果前端做网关app的就把自己的工作量降到了极致。这个梗是这样的:首先,前端是做嵌入软件的,需要发送多个用户信息到后台,这边使用http发送过来。本来呢,直接使用json或者xml格式把用户信息放在body里面就ok了。一开始说好了,用json格式,结果一个星期过去了。联调的时候发现这大兄弟发过来的...
qps 在项目初期,一般我们要评估一下用户量,以及项目特点。一般情况下,读多写少的项目偏多。所以qps(每秒查询率 queries-per-second)就成了处理流量多少的衡量指标。下面先记录一下各种常见的术语。qps(queries-per-second) : 每秒能处理查询数目,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内锁处理流量多少的衡量标准。tps(transa...
服务集群化的思考 近期因为工作需要,将原有的分布式系统迁移到docker群集,每个服务会部署多个容器,使用服务发现。1、整改过程中发现原来进程中类似单例模式的变量访问,其实只要加个锁就可以了,但是如果每个服务部署多个容器,那其实进程内部的全局锁就没什么用了。这个就类似多个进程要公用一个唯一的可变的变量一样,这个时候就需要使用分布式锁或者服务拆分了。举一个例子,调用微信公众平台的接口一般需要用到一个access_...
golang标准库中sync.Mutex性能测试 笔者原来是使用C++开发的,一直以为互斥锁时要是进程间通信中信号量的一个特例。在使用golang开发的时候,一直都很谨慎使用互斥锁,能用原子变量实现的就用原子变量实现。直到今天,测试了下golang标准库中sync.Mutex的性能以后,彻底的感觉到自己以前的无知和自以为是。经过笔者测试,两者的性能几乎没差异,有差异估计就是一点点封装消耗的性能成本。查看标准包中sync.Mutex实现的源码发现是...
golang插件plugin从使用到放弃 前段时间使用beego框架开发了好多web接口,苦于beego框架对http接口的单元测试支持的不是很好,在迭代空隙修直接使用httprouter作为路由。然后写一个rest接口入参为新增接口uri、实现接口的.so路径和实现rest接口的...
记一次rest_api监控提前发现潜在bug 花了大半年开发的项目要上线了,我在上线前一个星期把所有api都加上异常处理,如果api调用引发异常,都会把当前的调用栈和接口入参等信息保存到mongodb中。上线后,并没有收到bug处理通知。但是在mongodb中发现了一些异常数据。其中调用栈如下:"stack" : "goroutine 5297 [running]:error.getFuncStack(0x0, 0xc420016e7...
mongodb小结(数据入库) 这段时间做了一数据统计后台,db的选型上使用了mongodb,原因比较简单,就是需要统计的字段会经常随着需求变化而变化。在数据入库方面,经过各种尝试,个人稍微总结了一下:一、插入方式:1、如果要使用insert,那么一般情况下,这些数据是改动比较小的,或者是不用修改的,比如插入一些流水数据。2、如果插入的数据可能字段基本是一致的,就只有稍微那么一两个字段不一样,那么可以考虑使用upsert...
遇到mysql数据库事务隔离级别相关的小坑 几乎所有软件工程师都知道,mysql有4种事务隔离级别,但是实际开发过程中可能有时候忽略这个小细节,有时候可能是本来就没有考虑过,有时候也可能是其他的原因,比如我这次踩到的小坑。事情还原:1、需求一:是新建一个商户,但是客户要求在创建商户的时候要默认给他们开一个管理员账户。其实很简单,就是新建一个商户,然后再新建一个账户,账户表中有一个字段关联商户。但是一看数据库隔离级别,是Read Comm...
golang中xorm包使用map[string]interface{} 前言:许久没发个人博客了,最近有点忙,很是怀念以前有时间写博客的日子。最近做各种后台服务,写了N个rest接口,其中有相当一部分是和mysql挂钩的,这时候就使用起了golang的xorm包。特意记录下使用时候用到map[string]interface{}的场景。一、map[string]interface{}的使用点:1、去掉加密操作后,一般rest接口使用的数据格式大多为json格式,...
记一次关于golang使用xorm访问mysql事务不关闭引发的问题 事件还原:项目经理带客户体验公司的产品,发现机器前端提示网络异常,鉴于近期阿里云和腾讯云都发生过网络问题没有排查原因。过阵子,测试的同事跑去问qt前端的同事说网络这么久还异常啊。qt前端同事自己测试了一下,发现确实接口“有去无回”,就问了下后台的同事看看接口是否调的通。由于他们看的是心跳接口,后台同事一看,有些调用成功。然后就说可能是网络不稳定。ok,刚好后台同事写好需求同步服务后,qt前端的同事...
linux中/proc/buddyinfo的作用 在应用程序设计过程中,内存是很重要的资源,而计算机主机的内存资源时有限的。一般而言我们可以申请到的内存是有限的,并不是想申请多大就有多大就可以申请多大的。/proc/buddyinfo文件里,就记录着系统的内存资源。linux内核中使用了buddy算法来管理内存以减少内存碎片的产生,buddy算法管理最小的单一为PAGE_SIZE,一般情况下大小为4K。以2的N次幂一次增加。如下图表示,在no...
每天回顾linux命令(top) 前言 top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。并提供了互动界面,用热键可以管理。语法 top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]选项 -b:分批次显示结果。每次刷新的时候,是以追加的形式,而不是覆盖。 -c:显示完整的命令。
mongodb性能优化---golang篇 一般来说nosql的插入速度会比mysql等关系型数据库的要快些才对,上次用golang实现了可以在mysql中以2W+/s速度的插入小数据。理论上mongodb的插入速度应该会比mysql快。但是经过测试发现,每次往mongodb插入一条数据的话,插入速度只有1600次每秒。测试代码如下:package mainimport ( "fmt" "log" "ti
每天回顾linux命令(iotop) 前言 iotop命令是一个用来监视磁盘I/O使用状况的top类工具。和top有相似的UI。可以很直观的看出每个进程如何使用IO。在一些读写要求比较高的服务,比如数据库服务,经常会使用该命令来监视磁盘的使用状况。iotop在新安装的linux下一般是没有的,需要用户自己安装,还有就是一般需要管理员权限才可以执行。语法iotop (选项)选项 -o:只显示有io操作的进程。 -b:批量显示,无
C++11 forward_list C++11 中forward_list是一个单向链表,单向链表有其对应的有缺点吧。总体上其有缺点都不是很明显,所以不是很常见。主要还是用做优先级队列会比较合适。1、构造函数 —-默认构造,返回一个空链表 —-两个参数,一个为正整型n,一个位对应存储结构x,初始化n个节点,所有节点值位x —-两个参数都为对应结构的迭代子。创建一个新链表,内容为两个迭代子
C++11 bitset C/C++比较多的会应用在相对比较底层的服务,所以有可能会遇到位操作。在结构体中会有位域来简化位操作。这里,来介绍下C++11标准库中bitset的使用。1、构造函数 —默认构造,所有位都为0 —入参为对应数值类型 —入参为string 例子:// constructing bitsets#include // std::cout
每天回顾linux命令(df) 有一段时间没有复习linux命令了,其实这些都是对于开发来说都是比较基础的东西,日常一般日常都会遇到。平时没事干的时候,可以考虑花点心思来回顾一下,百无一害。 df命令 用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,剩下多少空间等信息。在日常监控的时候,一般就是使用df来监控磁盘的使用情况的,比如当磁盘使用量超过80%,需要提示运维人员。可以
C++11 array 大学期间没有学过C++,大学毕业后开发主要的语言是C++,其实应该说是C++98。看了c++ primer等书籍,有好多感觉都用不着。后来接触了golang,渐渐的发现C++98用起来很不方便。现在学习C++11发现,其实C++11已经和现在很多高级语言使用起来一样方便了,且不失去其高效性。所以,C++没有GC。后续,将慢慢学习C++11,从array开始记录吧。先不研究内部实现,后续再深入研究
C++大内存申请 1、未始化的全局变量 代码:int szTestData[1024 * 1024 * 1024] = {0};int main(){// int* piTestData = new int[1024 * 1024 * 1024]; return 0;}结果: 可以编译通过 但是运行结果为Segmentation fault (core dumped)
使用golang插入mysql性能提升经验 前言golang可以轻易制造高并发,在某些场景很合适,比如爬虫的时候可以爬的更加高效。但是对应某些场景,如文件读写,数据库访问等IO为瓶颈的场合,就没有什么优势了。前提基础1、golang数据库访问 在golang中数据库访问使用”database/sql”包提供的接口,不同的数据库,比如pg、mysql只需要提供对应的驱动就可以了。注意”database/sql”包提供的接口只针对关系型数据库,