自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(40)
  • 收藏
  • 关注

转载 发布一个参考tornado的高性能c++网络库:libtnet

libtnet是一个用c++编写的高性能网络库,它在设计上面主要参考tornado,为服务端网络编程提供简洁而高效的接口,非常易于使用。 Echo Server void onConnEvent(const ConnectionPtr_t& conn, ConnEvent...

2019-09-07 23:23:53 317

转载 高性能C++网络库libtnet实践:comet单机百万连接挂载测试

最近在用go语言做一个挂载大量长连接的推送服务器,虽然已经完成,但是内存占用情况让我不怎么满意,于是考虑使用libtnet来重新实现一个。后续我会使用comet来表明推送服务器。 对于comet来说,单机能支撑大量的并发连接,是最优先考虑的事项。虽然现在业界已经有了很多数据,说单机支撑2...

2019-09-07 23:23:48 441

转载 libcoro:在c++中支持coroutine

起因 在第一个版本的libtnet开发完成之后,我一直在思考如何让异步方式的网络编程更加简单。 虽然libtnet通过c++ shared_ptr以及function等技术很大程度上面解决了异步代码编写的一些问题,但是仍然会出现代码逻辑被强制拆分的情况。而这个则是项目中童鞋无法很好的使...

2019-09-07 23:23:44 277

转载 高性能C++网络库libtnet实现:http

HTTP libtnet提供了简单的http支持,使用也很简单。 一个简单的http server: void onHandler(const HttpConnectionPtr_t& conn, const HttpRequest& request){ ...

2019-09-07 23:23:39 948

转载 golang:高性能消息队列moonmq的简单使用

在上一篇moonmq的介绍中(这里),我仅仅简短的罗列了一些moonmq的设计想法,但是对于如何使用并没有详细说明,公司同事无法很好的使用。 对于moonmq的使用,其实很简单,样例代码在这里,我们只需要处理好broker,consumer以及publisher的关系就可以了。 首先...

2019-09-07 23:23:34 1205

转载 在golang中使用leveldb

leveldb是一个很强悍的kv数据库,自然,我也希望能在go中使用。 如果有官方的go leveldb实现,那我会优先考虑,譬如这个,但是该库文档完全没有,并且在网上没发现有人用于实战环境,对其能否在生产环境中使用打上问号,保险起见,我还是决定不使用。 因为leveldb有c的接口...

2019-09-07 23:23:30 769

转载 发布一个参考ssdb,用go实现的类似redis的高性能nosql:ledisdb

起因 ledisdb是一个参考ssdb,采用go实现,底层基于leveldb,类似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持。 我们现在的应用极大的依赖redis,但随着我们用户量越来越大,redis的内存越来越不够用,并且replic...

2019-09-07 23:23:30 221

转载 学习tornado:模板

第一次接触tornado的template,是在做oastub的时候,因为一位同学在handler里面硬编码了html代码,我决定引入template机制来降低逻辑与页面的耦合。 简介 tornado自带了一个简易的template引擎,使用它,我们可以很方便的构建自己的web页面。t...

2019-09-07 23:23:25 140

转载 一个简单的注册c函数到python的包装器

这几天继续研究了一下python,顺便看了一下如何注册c的函数到python,这方面网上的东西已经很多了,就不详细说明了。反正大概就是把要注册的函数写成 PyObject* Fun(PyObject* self, PyObject* args) 这样的形式,然后通过PyArg_ParseT...

2019-09-07 23:23:21 171

转载 学习tornado:安全

在web编程中,安全性是我们都必须面临的一个问题,包括cookie伪造,xsrf攻击等。tornado作为一个web framework,在安全性方面也提供了很多功能,这里简单介绍一下。 cookie 在web编程中,浏览器经常使用cookie来保存相关用户信息,用于与server交互...

2019-09-07 23:23:17 140

转载 golang使用pprof检查goroutine泄露

有一段时间,我们的推送服务socket占用很不正常,我们自己统计的同时在线就10w的用户,但是占用的socket竟然达到30w,然后查看goroutine的数量,发现已经60w+。 每个用户占用一个socket,而一个socket,有read和write两个goroutine,简化的代码...

2019-09-07 23:23:12 1411

转载 go-mysql,一个易用的mysql接口框架实现

介绍 go-mysql是一个用go写的mysql driver,使用接口类似于go自身的database sql,但是稍微有一点不同,现阶段还不支持集成进go database/sql中,但实现难度并不大,后续可能会接入。 go-mysql最先开始于mixer(一个用go实现的mysq...

2019-09-07 23:23:12 1323

转载 nginx性能优化

nginx性能优化 最近在测试服务器压力的时候,发现使用tornado的服务benchmark上不去,顶多1500左右,nginx即使开了8个进程,在响应请求的时候有一个work进程的cpu超高,达到100%的情况。 对于cpu超高的情况,当初我们都认为是2.6.18网卡中断只能在一个...

2019-09-07 23:23:07 86

转载 golang:使用timingwheel进行大量ticker的优化

Ticker 最近的项目用go实现的服务器需要挂载大量的socket连接。如何判断连接是否还存活就是我们需要考虑的一个问题了。 通常情况下面,socket如果被客户端正常close,服务器是能检测到的,但是如果客户端突然拔掉网线,或者是断电,那么socket的状态在服务器看来可能仍然是...

2019-09-07 23:23:03 729

转载 polaris: 一个用go实现的支持restful的web框架

介绍 polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计。 虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好的对restful模型进行支持。考察了很多开源实现,我决定还是重新造一个轮子,毕竟...

2019-09-07 23:22:59 591

转载 mixer: mysql协议分析

综述 要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议。这样才能通过proxy架起client到server之间的桥梁。 mixer的mysql协议实现主要参考mysql官方的internal manual,并用Wireshark同时进行验证。在实现的过程...

2019-09-07 23:22:54 154

转载 高性能C++网络库libtnet实现:Connection

Connection libtnet只支持IPv4 TCP Connection,之所以这么做都是为了使得实现尽可能的简单。我们主要在Connection类中封装了对tcp连接的操作。 Connection继承自std::enable_shared_from_this,也就意味着外部我...

2019-09-07 23:22:53 233

转载 缩略图架构实现

缩略图架构实现 笔者最近将缩略图功能引入了私有云系统中,这里简单记录一下。 架构 整体架构如下: 可以看到,笔者采用了通用的分层架构设计模式。 file storage存放着原始的图片数据。 image server用于图片的处理,同时进行图片的cache。 ...

2019-09-07 23:22:53 399

转载 我为什么选择go语言

这里,我并不打算引起语言争论的口水仗,我并不是什么大牛,对语言的造诣也不深,只是想通过自己实际的经历,来说说为什么我在项目中选择go。 其他语言的经历 C++ 在接触go之前,我已经有多年的c++开发经验。主要用在游戏服务端引擎开发以及P2P上面,那可是一段痛并快乐的时期,以至于我看...

2019-09-07 23:22:48 122

转载 golang:一个高性能低精度timer实现

在go自带的timer实现中,采用的是通常的最小堆的方式,具体可以参见这里。 最小堆能够提供很好的定时精度,但是,在实际情况中,我们并不需要这样高精度的定时器,譬如对于一个连接,如果它在2分钟以内没有数据交互,我们就将其删除,2分钟并不需要那么精确,多几秒少几秒都无所谓的。 以前我们...

2019-09-07 23:22:45 198

转载 谈谈自己造轮子

写下这篇文章,主要是对我近段时间工作的反思。 为啥要造轮子 对于一些程序员来说,喜欢自己造轮子可算是一个很平常的事情,我想可能有如下原因: 对于一些小的功能,不需要借助外部库,直接能够自己写完搞定。 对于一些大的功能,很多外部库不能很好的与自己项目整合,有时候还不如自己写一个。...

2019-09-07 23:22:41 1201

转载 一个简单的注册c函数到lua的包装器

前段时间写了一个注册c函数到python的简单的包装器,今天依葫芦画瓢,写了一个注册c到lua的包装器。虽然注册c函数到lua我在以前也写过一个包装器,而且使用起来更简单 (参照网址:http://blog.csdn.net/siddontang/archive/2008/04/20/23...

2019-09-07 23:22:37 68

转载 python与c的集成

记得在大学里和同学一起进行游戏开发,可到了后来完全无法继续下去,现在想想原因,一是自己的水平有限,另一个就是没做到游戏引擎与数据的分离,也就是没有理解脚本。那时的我根本就不知道什么叫做脚本编程,现在随着工作的深入也渐渐理解了一点。 虽然脚本语言有很多种,但是我毫不犹豫了选择了python,我...

2019-09-07 23:22:32 136

转载 mixer: 一个用go实现的mysql proxy

介绍 mixer是一个用go实现的mysql proxy,支持基本的mysql代理功能。 mysql的中间件很多,对于市面上面现有的功能强大的proxy,我主要考察了如下几个: mysql-proxy,mysql官方的代理,使用起来并不友好,需要进行lua定制,而且本人对其稳定...

2019-09-07 23:22:28 174

转载 一个简易版本的lua debugger实现

introduction 工欲善其事,必先利其器。lua作为一门动态语言,虽然我已经习惯了使用print来进行代码调试,但是还是有很多童鞋觉得一款好用的调试器能更好的进行lua代码编写。所以在以前接手游戏的lua结合层之后,自然就需要提供一个debuger工具了。 我们只需要的是一个能...

2019-09-07 23:22:24 311

转载 注册C函数与类成员函数到lua

在lua中调用c函数,我们通常要将c函数转换成相应的注册函数,也就是如下形式 int function(lua_State *L) {} 可是如果我们每个都函数都这么写,既重复了太多的工作量,又容易出错,所以自然想到了用一层代理来连接注册函数与本来的c函数。于是我们可以这样 ...

2019-09-07 23:22:20 250

转载 web多语言url的设计

因为项目要支持国际化,最近跟一个同事在讨论多语言版本下面url如何设计,假如我们需要支持en和cn的版本。 他倾向于支持如下的url格式,后续以格式1指代: /en/group/abc.html/cn/group/abc.html 而我则倾向于只提供一套url,lang的信息在...

2019-09-07 23:22:15 357

转载 在go中使用linked channels进行数据广播

在go中使用linked channels进行数据广播 原文在这里(需翻墙),为啥想要翻译这篇文章是因为在实际中也碰到过如此的问题,而该文章的解决方式很巧妙,希望对大家有用。 在go中channels是一个很强大的东西,但是在处理某些事情上面还是有局限的。其中之一就是一对多的通信。ch...

2019-09-07 23:22:07 90

转载 mixer: sql词法分析器设计

介绍 mixer希望在proxy这层就提供自定义路由,sql黑名单,防止sql注入攻击等功能,而这些的基石就在于将用户发上来的sql语句进行解析。也就是我最头大的词法分析和语法分析。 到现在为止,我只是实现了一个比较简单的词法分析器,用以将sql语句分解成多个token。而对于从t...

2019-09-07 23:22:03 222

转载 lua c函数注册器

lua与c的交互 关于lua和c的交互,主要有两个方面,一是lua调用c的函数,而另一个则是c调用lua函数。而这些都是通过lua stack来进行的。 c调用lua 在c里面使用lua,主要是通过lua_call这类函数,下面来自lua manual的例子: lua_getglo...

2019-09-07 23:21:59 221

转载 static_cast NULL的问题

今天头突然把我写的一段代码发给我,问我有什么问题,如下 假设B继承于A void fun(A* pA) { B* pB = static_cast<B*>(pA); if(!pB) return; ...

2019-09-07 23:21:55 652

转载 升级ubuntu后EMACS 无法使用

公司同事把服务器上ubuntu升级到了dapper,结果发现emacs用不了了,启动出现undefined color "black"错误,到网上看了看,解决如下: sudo ln -s /etc/X11/rgb.txt /usr/X11R6/libsudo ln -s /etc/X11/...

2019-09-07 23:21:50 132

转载 sqlite相关操作

今天编程时,在一个数据库操作问题上一直报错,没办法只好查看一下数据库,由于该数据库用的是sqlite,所以就看了一下sqlite文档。 1.假设数据库为a_db.sqlite,运行sqlite3 a_db.sqlite,就进入了sqlite的命令模式 2.运行./help为...

2019-09-07 23:21:47 56

转载 gopkg:一种方便的go package管理方式

在使用go的过程中,我们有时候会引入一些第三方库来使用,而通常的方式就是使用go get,但是这种方式有一个很严重的问题,如果第三方库更新了相关接口,很有可能你就无法使用了,所以我们一套很好地包管理机制。在读生产环境下go语言最佳实践有感一文中,我介绍过soundcloud公司的做法,直接将...

2014-07-24 13:29:00 216

转载 leetcode:程序员面试技巧

起因写在开头,脑袋铁定秀逗了,历时20多天,刷完了leetcode上面151道题目(当然很多是google的),感觉自己对算法和数据结构算是入门了,但仍然还有很多不清楚的地方,于是有了对于每道题目写分析的冲动。不过在看到leetcode上面的文章之后,决定先从翻译入手,顺带再写写自己做题的心...

2014-07-22 23:54:00 88

转载 celery最佳实践

作为一个Celery使用重度用户,看到Celery Best Practices这篇文章,不由得菊花一紧。干脆翻译出来,同时也会加入我们项目中celery的实战经验。 通常在使用Django的时候,你可能需要执行一些长时间的后台任务,没准你可能需要使用一些能排序的任务队列,那么Celery将...

2014-06-25 16:45:00 50

转载 我的编程语言经历

Alan Perlis 说过:“一种不改变你编程的思维方式的语言,不值得去学。”,虽然写了这么多年程序,用了这么多的语言,但我自认还没悟道编程语言如何改变我的思维方式。 几天前,我需要用python来为ledisdb写一个客户端,我突然发现,对于c++,go这种语言,我如果需要实现一个功能,...

2014-06-22 21:32:00 50

转载 高性能nosql ledisdb 设计与实现(2)

ledisdb现在已经支持replication机制,为ledisdb的高可用做出了保障。 使用 假设master的ip为10.20.187.100,端口6380,slave的ip为10.20.187.101,端口为6380. 首先我们需要master打开binlog支持,在配置文件中...

2014-06-22 21:31:00 54

转载 高性能nosql ledisdb设计与实现(1)

ledisdb是一个用go实现的基于leveldb的高性能nosql数据库,它提供多种数据结构的支持,网络交互协议参考redis,你可以很方便的将其作为redis的替代品,用来存储大于内存容量的数据(当然你的硬盘得足够大!)。 同时ledisdb也提供了丰富的api,你可以在你的go项目中方...

2014-06-04 17:10:00 79

转载 读生产环境下go语言最佳实践有感

最近看了一篇关于go产品开发最佳实践的文章,go-in-procution。作者总结了他们在用go开发过程中的很多实际经验,我们很多其实也用到了,鉴于此,这里就简单的写写读后感,后续我也争取能将这篇文章翻译出来。后续我用soundcloud来指代原作者。 开发环境 在soundcloud...

2014-05-12 11:08:00 78

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除