自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

星空漫野

原谅我黑白颠倒!~

  • 博客(46)
  • 资源 (2)
  • 收藏
  • 关注

原创 从架构师的角度看服务器端架构点滴

任何服务器端的架构设计,都是性能、一致性和成本三者的权衡。从我在目前的大规模互联网视频公司的负责APP服务器端的角度来讲,我主要关注以下几个点:业务、可靠性、性能、可维护性一、业务框架上保证业务的快速迭代,在性能要求不高的情况下,同步架构会比异步架构更为简单,协程架构则兼具有开发简单和性能较高的特点。二、可靠性保障无重大故障。1.接口层面当后端服务异常时,能通过降级解决

2015-10-01 15:16:17 3165

原创 JMX经验点滴

使用Java构建的大规模分布式架构

2014-08-25 16:34:10 900

原创 使用OpenSSL做RSA签名验证 支付宝移动快捷支付 的服务器异步通知

由于业务需要,我们需要使用支付宝移动快捷支付做收款。支付宝给了我们《移动快捷支付应用集成接入包支付接口》见支付宝包《WS_SECURE_PAY_SDK》。支付宝给的服务器demo只有Java、C#、PHP三种,而我们服务器端使用的是C++。这其中就涉及到接收支付宝的服务器异步通知。为了确保接收到的服务器异步通知来至支付宝,我们就必须验证支付宝的签名。坑爹的是,原来PC端使用MD5做签名,估计支

2014-07-23 17:44:59 45479 4

原创 Android单张图片查看、单指移动、双指缩放、双击最大化或最小化

Android平台上查看单张图片时,通常情况下需要实现图片查看、单指移动、双指缩放、双击最大化或最小化功能。目前网络上的实现方式,都没有将此功能封装为类,零落在类和xml文件中,代码难以阅读,功能难以复用。为此,我专门写了一个类做此功能。此类唯一的缺点是没有实现回弹动画。不说废话了,上代码。代码如下:package com.example.test;import andro

2014-01-23 20:05:59 9708 7

原创 在Linux服务器上安装Oracle客户端库

1.登录www.oracle.com,并注册一个账号;2.登录以上Oracle官方网站,点击DOWNLOADS->Database->Oracle Instant Client,当前我进入的页面为(http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html)3.根据服务器的环境选择

2013-04-16 17:08:31 3044 1

原创 Linux C++程序解决文件句柄(包括socket句柄等)耗尽问题

最近在线上发现一个问题,程序在服务器上跑了3周后,会出现新日志文件创建不出来的问题,另外,该程序需要使用curl访问后端的HTTP服务调用总是失败。日志文件创建不出来由于不是关键业务,一开始没有做太多关注。但是访问后端HTTP服务失败的问题却是很要命。监控报警一响,我们首先尝试解决问题,就重启了所有程序,问题解决。之后,就立马排查这个问题发生的原因。在没有重启程序前,首先怀疑的自然是后端HTT

2012-08-01 11:51:18 5513

原创 编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存)

在Linux命令行中执行top命令,可以查询到所有进程使用的VIRT虚拟内存、RES常驻内存和共享内存SHR。那么,什么是VIRT虚拟内存、RES常驻内存和共享内存SHR?我们编写的Linux C++程序如何影响它们呢?查阅资料后,归纳一下。VIRT:1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;

2012-07-31 18:59:18 14871 1

原创 C++使用libcurl做HttpClient

当使用C++做HTTP客户端时,目前通用的做法就是使用libcurl。其官方网站的地址是http://curl.haxx.se/,该网站主要提供了Curl和libcurl。Curl是命令行工具,用于完成FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP的命令的请求及接收回馈。libcurl提供给开发者,用于使用C++跨平台的开发各种

2012-06-14 19:25:50 101554 25

原创 使用rsync完成Linux服务器间同步目录

以前为了完成多台Linux服务器之间的代码同步功能,都是使用shell脚本和scp命令,导致同步不同的项目都要写新的脚本,这个有明显是重复的工作量。今天突然发现了rsync这个工具,对于对等性质的系统(所有服务器的服务完全一致)而言,能够有效的提高工作效率。rsync的主页地址为:http://rsync.samba.org/ 最新版本为version 3.0.9。安装直接

2012-03-08 13:34:47 2940

原创 对象池的实现

为了提高new对象的速度,工程师们提出了对象池的解决方案。即一次性分配大量的空间,供开发者创建对象使用;当分配的大量空间不够时,再次分配大量的空间。嗯,这种方式,在内存池中是没有问题的。但是,由于对象构造时需要执行构造函数,析构时需要执行析构函数,这时就需要一种特殊的方式来解决在已经分配了的空间上执行构造函数。这,就是placement new。示例:char * p = new

2012-02-15 19:57:13 1593

原创 内存池的实现

相对于在栈空间分配内存,堆中分配内存其实是非常缓慢的。另外,由于堆中分配的内存,需要开发者编码回收,当系统非常庞大时,容易出现分配的内容没有回收导致内存泄露的现象。因此,许多Bible建议开发者尽量使用栈空间,少用甚至不用malloc和free、new和delete;虽然栈的空间较小,但这样的建议随着计算机的位数从32位升级到64位,越来越成为真理。但我还是想说,这是有限制的:

2012-02-15 19:45:51 2036 1

原创 基于jwSMTP的C++发送Email的Demo

由于业务上存在发送报警邮件的需求,一直想找一个简单易用的发送Email的C++库。终于找到了,它就是jwSTMP(http://sourceforge.net/projects/jwsmtp/)。最新的jwSTMP版本(1.32.15)能够跨平台(BSD、Linux和Windows等)的支持以C++代码或者C++库的形式编码发送Email。它可以发送附件、支持多个收件人(最

2012-02-15 11:33:40 8131 5

原创 基于网络游戏资料数据的搜索系统的设计

目前,越来越多的网络游戏有在官方网站上提供游戏内部数据(道具数据,任务数据,NPC数据,成就数据等)的检索服务的需求。 以前这种系统,基本上是将游戏内部数据抽取出来,放入到数据库中,然后前端系统使用SQL语句来查询(select和like)。这种实现方式,简单、快速,但是,用户在搜索时,只能少输入词、不能多输入字,不支持权重排序(Rank),匹配度不高,体验不太好。 怎样实现一个体

2011-06-05 17:19:00 1269

原创 Cassandra V0.7.4 新手入门点滴

<br />Cassandra是有FaceBook开发并开源的一个NoSQL分布式存储。目前是Apache基金会下面的一级项目,它的官方网站是http://cassandra.apache.org/。<br /> <br />相对于Memcache和Redis这些NoSQL(not SQL)或者说Key-Value存储,Cassandra与MongoDB、HBase在形态在趋于一致,为NoSQL(Not Only SQL)。这是因为Cassandra相对于简单的Key-Value存储,能够支持比较复杂的嵌套

2011-04-20 21:40:00 2835

原创 大型游戏开放平台对redis v2.0.4使用感悟点滴

<br />redis是一个开源的、高级的key-value存储(官方网站http://www.redis.io/语)。它支持string、hash、list、set和sorted set。<br /> <br />下面我将分别用“场景”、“选型”、“应用”和“陷阱”等几个方面叙述一下我2个月使用redis的经验。<br /> <br />场景<br /> <br />在大型游戏开放平台项目中,我们面临着和传统Sns网站不一样的场景。传统Sns网站,它的内容由用户提供而被另外一些用户浏览,即UGC模式——用

2011-03-27 19:59:00 5912

原创 使用Java读写存储在latin1编码的MySQL中的UTF-8编码的中文

绝大多数情况下,一个项目中,都是使用同一套编码。如,全部使用UTF-8或者GBK。但是当涉及到多个项目合并、新手加入等情况时,不可避免出现使用多套编码的情况。所有字符串都是英文的情况还好,若是出现了中文,就导致了乱码的出现。下面以我碰到的问题的解决方案说明。前置说明:==============Java            MySQLUTF-8          utf8ISO-8859-1 latin1==============MySQL数据库使用latin1的编码,导入导出的数据是UTF-8编码的,

2011-02-23 15:27:00 19790 5

原创 游戏开放平台开发历程

由于加入到集团战略级别的项目——“开放平台”的开发中,已经近两个月没有写Blog了。各级领导的重视、不断累加的需求、平台架构的逐步迭代,竞争对手项目的上线、运营及社区同事的紧逼,导致的是无休止的加班加点。感谢“游戏开放平台”,让我经历了和公司最高层一起闭关筹划项目战略、部门建立、和各方人员探讨需求、系统架构的设计、硬件的选型、软件的设计及实现这一系列从无到有的过程,以及对升职加薪的种种美妙预期。这三个月,让我从无限期待到绞尽脑汁到奋力拼搏到身心疲惫到咬牙不放弃到坚持到底到现在总算看到一丝胜利曙光以及可以预料

2011-02-21 20:54:00 1740 1

原创 协程框架的堆栈大小陷阱

<br />昨晚和同事联调我们的开放平台,由于基于协程框架的网关服务器总是在接受两个消息后发生段错误,Core Dump掉,让我们百思不得其解。<br /> <br />查看Dump文件,没有任何有效的调试信息。gdb设置断点调试,程序总是在接受到第二条消息之前,没到断点就崩溃。而日志信息却可以打到在断点之后。搞了一个多小时,真的让我们很崩溃。<br /> <br />最后,到晚上一点多后,我们决定改大一下协程的栈空间大小试试。结果让我们兴奋不已,连续发送了几百条消息,都不会出现任何问题。<br />优化栈

2010-12-29 14:05:00 4905 3

原创 GoogleTest单元测试框架

<br />早就想将这半年使用GoogleTest的心得体会写下来,以做备忘录。总算在这忙里偷闲的时间,将其记录下来。<br /> <br />不想直接就写我认为的重点和难点的位置。还是从基础开始说起吧。<br /> <br />GoogleTest是Google开发的一套单元测试框架。能够在不同平台上(Windows,Linux,Mac OS X,Cygwin,Windows CE和Symbian)为C++编写的程序做单元测试。<br /> <br />它是基于xUnit架构(如JUnit)的测试框架,支

2010-12-09 22:23:00 1434

原创 再谈OAuth和Connect

这两天又一次反复考虑和均衡把握衡量了一下OAuth和Connect两种开放平台授权模式。再说一下它们之间的比较重要的区别:1.OAuth的授权流程主要是通过Request Token和Access Token完成的,而Connect的授权流程主要是通过SessionKey完成的。SessionKey,用来维护用户的登录状态。SessionKey的有与没有,失效与否,代表用户是否已经登录开放平台。SessionKey用户和第三方应用是可以拿到的。SessionKey并非是一个OAuth名词。由于在整个流程中,

2010-12-07 20:34:00 1312

原创 2010 GDC观后感

<br /><br />今天参加GDC,听到了如下几场演讲:<br />《PayPal助力中国网游迈向海外》<br />这场演讲给我的感觉,好像是一场公司介绍和产品推荐会。但其中还是有几点是非常有价值的:<br />1.  微支付与常规支付的区别(上下文内支付,费率区别,快速支付,全球化)<br />2.  上下文支付。对于虚拟物品支付,为了避免用户在支付过程中由于吸引人的广告等信息离开当前网络应用,在当前上下文内支付(当前网页内支付,不能离开当前网页)是有应用需求的。<br />3.  费率。第三方支付系

2010-12-06 19:57:00 1050

原创 协程在Web服务器中的应用

      协程(纤程,微线程)这个概念早就有之,各家互联网公司也都有研究,但在国内各大论坛和大会热起来,还是今年的事。      最近参与讨论开放平台建设和架构设计过程中,有同事提到了使用协程代替线程,能够很大幅度的提高性能。这引发了我们团队极大的兴趣和激烈的讨论。首先,说明一下什么是协程。      协程是用户态的线程。传统上线程的切换是由操作系统控制的,并且,每次切换都涉及到上下文的保存切换和用户态与内核态之间切换的过程。而协程的切换是由用户自己控制的,并且每次切换只涉及到上下文的保存与切换(即栈的出

2010-11-29 11:32:00 4724

原创 开放平台安全性考虑

开放平台由于将内部大量的资源开放出去,需要特别考虑安全性问题。这里的安全性是泛指的。我觉得有以下几个方面需要考虑的。安全(Safety)这个是指数据丢没有丢失的问题- 数据篡改- 数据不一致(脏数据):有数据映射关系和分布式情况下很容易出现该问题- 人为操作失误导致的数据丢失为了解决这个问题,我们需要建立数据分级体系。不同的数据,我们有不同的安全级别。- 绝对安全- 磁盘损坏允许丢数据- 断电允许丢数据- 磁盘损坏和断电都允许丢数据- Cache级别,允许丢失,被替换等安全(Security)这个是指数据被

2010-11-27 11:35:00 1967

原创 OpenID流程概述及其与OAuth的区别

目前OpenID在互联网上已经讨论的比较充分,也有很多中文资料。其与OAuth的区别在网络上也有很多介绍。但是,我还是决定将使用OpenID登录的流程图画下来。并初步分析一下OpenID和OAuth之间的区别。OAuth和OpenID的区别在于应用场景的区别,OAuth用于授权的,是一套授权(Authorization)协议;OpenID是用来认证的,是一套认证(Authentication)协议。两者是互补的。请允许我还是举那个老外的经典例子:“OpenID:1.用户希望访问其在example.com

2010-11-19 15:56:00 10249

原创 OAuth流程介绍

OAuth协议致力于使应用能够在无须用户透露其认证证书或者密码的情况下,通过API访问开放平台的服务的隐私资源。更一般地说,OAuth为开放API认证提供了一个可自由实现且通用的方法。详细说来,整个过程如下:1.   应用使用者请求应用2.   应用发现有应用使用者的请求,则通过APP ID及Secret向开放平台请求获取未授权的请求令牌3.   开放平台向应用签发未授权的请求令牌4.   应用引导应用使用者至开放平台提供商的登录服务器,服务提供方认证用户并获取许可5.   开放平台提供

2010-11-19 09:40:00 2452

原创 SNS开放平台产业链

目前SNS开放平台,从产业链来说,其实际上包含了如下几块内容:1.   主营业务,如淘宝的交易服务,校内的SNS服务等;2.   开放平台API,将SNS网内内部数据提供给第三方开发者的接口,如淘宝,校内,51等的开放平台;盈利方式:通过API使用次数,频率计费;通过和第三方应用开发者分成。3.   第三方应用开发者,如五分钟公司;盈利方式:卖给终端用户应用拷贝,使用时长收费等;由应用容器方买断;与应用容器方分成广告收益等。4.   第三方应用托管者,如Google的托管服务;盈利方式:收取

2010-11-19 09:30:00 1196

原创 C++ new的nothrow关键字和new_handler用法

<br />今天和同事review代码时,发现这样的一段代码:<br /> <br />Manager * pManager = new Manager();<br />if(NULL == pManager)<br />{<br />    //记录日志<br />    return false;<br />}<br /> <br />然后,一个同事就说这样写欠妥,应该改为:<br /> <br />Manager * pManager = NULL;<br />try<br />{<br />   

2010-11-03 15:42:00 16447

原创 Key-Value配置信息类(.ini文件信息管理类)的设计与实现

此实现相对于其他实现,能够读取.ini文件或者将类存中的Key-Value信息存储到配置文件中。另外,能够将配置信息合法的以int,long,double,float,std::string等各种类型读取,避免了用户的转换。#ifndef __PROPERTIES_H__#define __PROPERTIES_H__#include /*** @brief 一个Key-Value的配置信息类,可用于读取Key-Value文件(.ini),* 也可以将内存中的Key-Value信息存储到

2010-11-01 09:56:00 2050

原创 大规模分布式消息中间件简介

<br /><br />当前各种RPC中间件技术已经广泛应用于各个领域。其中,服务器之间消息通讯这种功能广泛应用于这些中间件中,于是,将这种面向消息的中间件(Message Oriented Middleware,MOM)抽象出来,形成通用的消息中间件,成为业内主流。目前消息中间件的标准主要有:JMS和AMQP。实现则是百花齐放。<br />消息中间件从功能上需要解决以下问题:<br />1.同步或异步的消息传输,尤其是异步的消息传输<br />同步发送消息是发送消息后,阻塞等待消息是否发送成功的回馈,如果

2010-10-27 18:44:00 29628 2

原创 什么是创新?

<br />什么是创新?不同的人有不同的答案。<br /><br /><br />在公司内部的微博上,答案从高层的综述(总结),到员工的的奇思妙想,不一而足。<br /><br /><br />就我个人而言,从互联网行业来看,我觉得,有四种创新:<br /><br /><br />1.业务创新。国外的,如12年前的Google搜索,8年前的Google关键词广告(AdWords),7年前的Google AdSense;6年前的Facebook;以及现在大热的Twitter。国内的,则有11年前的阿里巴巴B2

2010-10-22 21:46:00 1305

原创 使用Visual Studio Profiler分析程序性能

<br />    Profiler是Visual Studio中集成的性能分析工具。它主要用于分析程序中所有函数调用所占的耗费时间。它提供了Sample和Instrumentation两种检测方式,能够生成简洁易读的报告。它只适用于Team Suit版本。<br />    <br />    下面性能分析的环境是在Windows XP SP2,Visual Studio 2008 Team Suit环境。<br /> <br />    首先,打开您需要测试的程序的解决方案或项目文件,需要说明的是被测试

2010-10-12 13:42:00 29913

原创 Google今年校园招聘超囧笔试题

<br />听学弟说,今年Google在北大的应届生笔试题有一道选择题是:<br /> <br />现在北京有一套房子,价格200万,假设房价每年上涨10%,一个软件工程师每年固定能<br />赚40万。如果他想买这套房子,不贷款,不涨工资,没有其他收入,每年不吃不喝不消<br />费,那么他需要几年才能攒够钱买这套房子? <br />A, 5年 <br />B, 7年 <br />C, 8年 <br />D, 9年 <br />E, 永远买不起<br /> <br />我看了看,选E。看来软件工程师这个职

2010-09-30 09:49:00 1378 1

原创 用户登陆的字节串校验和加密解密点滴

<br />    最近正在做一个游戏服务器框架的LoginServer的用户信息校验模块。这种校验模块一般都分为两部分,字节串校验解密和数据库数据查询相关。数据库数据查询我比较熟,但是字节串校验解密倒是第一次做。使用OpenSSL,搞了两天才全部搞定。<br /> <br />    这个过程,总算将大学里学习的一些基础的密码学知识给捡了回来,而且有了更深层次的体会。我相信,如果大学里老师不是照本宣科,让我们在实际中使用一下OpenSSL的库,编编程序,我相信,我绝不会将他教给我的密码学知识全部换给他。这

2010-09-27 13:39:00 2136

原创 MySQL与Transact SQL(MS SQL Server)的SQL语句区别点滴(C++)

<br />最近在写一个数据访问层,要求能够使用MySQL和MS SQL Server。<br /> <br />烦劳从此开始,MySQL与MS SQL Server的大量不一致让人烦不胜烦,为了使其他人不再犯自己工作过程中犯下的错误,并且,有个地方记录自己的心得体会,特分享如下:<br /> <br />这里MySQL使用的是C API<br />MS SQL Server使用的是ADO<br /> <br />一.列类型问题<br />1.时间类型<br />真是不做不知道,做了才知道,MySQL存储日

2010-09-02 16:24:00 3097

原创 最想挖的各家互联网公司最牛职位人才

<br />百度:搜索工程师<br />有着中国最大份额的网页搜索市场份额的百度,无疑是国内培养搜索工程师的顶尖公司。要知道,没有到一定的网页访问量级,很多问题都是你想不到,碰不到的。而这些,在百度,你能够碰到,可以了解,甚至获取到成熟的解决方案。可以说,国内各家公司,如果想做搜索,想招搜索方面的人才,这里的搜索工程师,一定可以满足你们的需求。<br /> <br />阿里巴巴系(阿里巴巴变,淘宝,支付宝等):DBA,Java工程师,视觉<br />中国最牛的DBA,基本都集中在阿里系,尤其是Oracle方

2010-08-25 20:54:00 1871

原创 简单LRU算法实现的Cache(C++)

<br />#pragma once#include <map>#include <time.h>template<typename CacheKey, typename CacheValue>class LRUCache{public: LRUCache(void); LRUCache(int capacity); ~LRUCache(void); void Put(const CacheKey & key, const CacheValue & value);

2010-08-20 21:59:00 2817

原创 使用QueueUserWorkerItem实现的线程池封装

此线程池所依赖的线程类,请参看《一个Windows C++的线程类实现》:http://blog.csdn.net/huyiyang2010/archive/2010/08/10/5801597.aspxSystemThreadPool.h#ifndef __SYSTEM_THREAD_POOL__#define __SYSTEM_THREAD_POOL__#include "Thread.h"#include #include #include class CThr

2010-08-18 12:29:00 1813

原创 一个Windows C++的线程池的实现

此线程池所依赖的线程类,请参看《一个Windows C++的线程类实现》:http://blog.csdn.net/huyiyang2010/archive/2010/08/10/5801597.aspxThreadPoolExecutor.h#ifndef __THREAD_POOL_EXECUTOR__#define __THREAD_POOL_EXECUTOR__#include "Thread.h"#include #include #include clas

2010-08-13 15:30:00 9430 15

原创 一个Windows C++的线程类实现

Thread.h#ifndef __THREAD_H__#define __THREAD_H__#include #include #include class Runnable{public: virtual ~Runnable() {}; virtual void Run() = 0;};class CThread : public Runnable{private: CThread(); explicit CThread(CThrea

2010-08-10 15:16:00 13650 10

原创 对于一个功能较完备的日志组件的需求点

如今,对于任何一家互联网企业,在服务器端,日志都是不可或缺的部分。日志的存储,有:1.错误信息的记录2.信息的统计作用3.操作的回滚和恢复作用那么,一个日志组件,应该有哪些功能需要提供呢?1.日志能够存储在各种地方:本地文件,远程文件,本地SQLite,远程数据库,消息中间件等;2.为了提高性能,日志必须是异步写的,同步写会阻碍用户的正常操作的执行;为了保证写入的正确性和确定性,必须同步写,强制写。3.日志能够设置级别,如:ERROR,WARN,INFO,DEBUG等。可以设置打印某一级别以上的日志;4.能

2010-08-01 16:17:00 1223

HTTP1.1协议RFC2616中文版

HTTP1.1协议(RFC2616)的中文版本,市面上中文版本可是很难找到的哦!

2012-06-14

OAuth协议1.0版本中文版

OAuth协议1.0版本中文版,描述了什么是OAuth,OAuth协议的具体内容等等

2011-01-10

空空如也

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

TA关注的人

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