1. Base64编码原理与应用

    2015年,我们在青云平台上实现了“百度云观测”应用。青云应用本质上是一个iframe,在向iframe服务方发送的请求中会携带一些数据,青云平台会使用Base64 URL对这些数据进行编码,其提供的编码解码算法示例如下:

    // php版本
    function base64_URL_encode($data) {
      return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
    }
    function base64_URL_decode($data) {
      return base64_decode(str_pad(strtr($data, '-_', '+/'), 
                                strlen($data) % 4, '=', STR_PAD_RIGHT));
    }
    

    可以看出,Base64 URL 是标准Base64编码的一个变种,分别用 -_ 替换标准Base64编码结果中的 +/ ,并删除结果最后的 =

    在实现 “百度云观测” 青云应用时,我在想:

    • 为什么要使用Base64编码?
    • Base64编码算法是什么样的?

    本文是围绕这两个问题思考和实践的结果。

    我认为 …

    Tagged as : 笔记 编码
  2. 基于Github的pull request流程做开源贡献

    最近给 beego 提了几个 pull request (简称PR),都已被接受。在使用pull request的过程中,遇到了一点小问题,才知以前并非真的理解这个流程,故在此做点记录整理。

    我以 beego 为例,将pull request的整体使用流程绘图如下:

    fork-pull-request

    beego代码库有两个长期分支 masterdevelopmaster为稳定分支,develop为开发分支,所有PR都要求提交到 develop 分支。

    1. 先将 astaxie/beego 代码库 fork 一份到自己的名下(如我的 youngsterxyf/beego)。
    2. youngsterxyf/beego clone 到本地机器上做开发。因为PR要提到 astaxie/beego 的 develop 分支,所以最好对应地在你fork的代码库的 develop …
    Tagged as : github 笔记 git 开源
  3. 关于Redis与Memcached的一点澄清(译)

    原文:Clarifications about Redis and Memcached

    译者:youngsterxyf

    译注:本文为Redis的作者所写

    如果你了解我,就会知道我并不是那种认为竞品是一件坏事的人。实际上我喜欢用户有选择的空间,因此我很少做将Redis与其他技术做对比这类事情。

    然而,为了选择正确的方案,用户必须获取正确的知识,这一点也是理所应当的。

    本文的起因是读了Mike Perham写的一篇博文,你也许知道他是Sidekiq这一流行程序库的作者,Sidekiq又恰好使用Redis做后端。因此我毫不认为Mike是一个“反对”Redis的人。但在博文(你可以在 http://www.mikeperham.com/2015/09/24/storing-data-with-redis/ 找到这篇博文)中,他陈述到:要用缓存,“你可能应该选择Memcached(而不是Redis)”。这样看来,Mike确实简单地相信Redis不适合用做缓存,在文章中他是这样论述的:

    • 1) Memcached专为缓存而设计
    • 2) 它根本不会有磁盘I/O操作
    • 3 …
    Tagged as : 翻译 Redis Memcached
  4. 青云 iframe 应用开发

    上周的主要工作是将产品的功能集成到青云。青云提供 iframe 的方式来集成第三方服务,这是一种互利的做法,而且对于青云来说,实现的代价也非常小。

    先上图,看看集成的效果:

    ygc-in-qingcloud


    对于青云来说,一个iframe应用就是一个URL,由应用开发者提供这个URL,当青云用户访问应用所在的页面时,页面先自动向应用服务器的URL发送数据请求,请求会携带认证信息,应用服务端需要先校验请求确实来自青云,并获取请求中的用户信息,最终响应一个HTML页面内容,青云应用页面收到响应数据后将其置于一个iframe标签中,之后青云用户在iframe页面中的操作都是直接与应用服务器交互。

    qingcloud-iframe-interaction

    上图交互流程的第2步中,青云服务器向用户响应的内容最终会生成一个包含以下内容的页面:

    <form method="POST" action="URL" target="appframe">
        <input type="hidden" name="payload" value="...">
        <input type="hidden" name="signature" value="...">
    </form>
    <iframe id="..." name="appframe" width="100 …
    Tagged as : 笔记 工作 总结
  5. 又一次系统故障

    上周五早上9点多,我还在上班的路上,接到技术leader的电话:线上突然出故障了;接着发来一张故障信息页面截图:

    system-fault-err-page

    截图包含的信息是:数据库中没找到数据表Users

    但同事检查过数据库,Users数据表是存在的。


    我快速地回忆了一下最近的代码发布和环境变更 - 前一天有个同事对线上机器做了点改动。因此,让同事赶紧检查一下之前的改动是否有问题,经检查确认改动没有问题,而且稍微思考一下就应该明白不是配置的问题,如果是配置的问题,那么问题应该早就出现了,而不是在早上9点多时候才发生。


    我翻了翻手机中最近收到的几条告警短信,去除重复告警短信,只有两条告警:

    • 某台Web服务器上出现大量的500错误
    • 某台数据库服务器的磁盘使用率为98.99%

    由此可以推测两个故障原因:

    1. 那台Web服务器上应用的数据库配置有问题 - 但检查之后确认没有问题
    2. 由于那台数据库服务器磁盘满导致的问题,虽然一时还想不到其中的关联 - 同事在检查之后,确认那台机器的磁盘确实已满,但通过内网的数据库管理后台,可以正常访问数据库,所以认为应该不是磁盘满导致的问题

    如此,一时我也没想明白故障的原因。


    接着,同事发来消息:只有登录用户才会遇到这个问题!

    这时,基于之前的线索,基本能断定故障原因是 - 数据库服务器磁盘满。为什么呢?

    1. 数据库管理后台默认是只读:读数据表列表、数据表结构、单个表的若干条数据 …
    Tagged as : 笔记 故障
  6. 记一次系统故障

    前段时间,工作中遭遇一次故障,虽然不算什么“疑难杂症”,倒也花了不少时间才真正找到故障的原因,故也值得记录一下。

    为方便读者快速理解故障,先给出系统大致的架构图:

    gxt-tech-arch

    其中,

    1. 每台Web服务器上开启12个PHP-FPM实例,并配置到Nginx的upstream,每个实例最多可以开启10个子进程
    2. “Database Proxy”的代理规则为:写操作及事务中的所有SQL操作都交给主MySQL处理,其余的读操作都交给任意一台从MySQL处理

    故障所表现的现象包括:

    1.大量请求响应为502,但每次故障发生时,错误响应一般集中在一台Web服务器,如下图所示:

    nginx-502-error

    nginx-502-count

    2.(一台或多台)MySQL数据库服务器CPU使用率飙升(但并非总是一起表现故障),如下图所示:

    mysql-slave-server-idle


    故障刚开始出现时,重启/关闭出现故障现象的MySQL服务,或将出现故障的Web服务器上所有PHP-FPM重启,也能解一时的问题,但治不了本,故障还是频繁出现。

    在故障发生时,从相关服务器上收集到的信息如下所示:

    1.出现故障现象的Web服务器 - CPU使用率、内存使用率等系统指标均正常,但PHP-FPM子进程数达到上限(12 x 10 = 120),并且PHP-FPM进程与数据库代理服务器之间的网络连接数量较多(与PHP-FPM子进程数大致相当)

    2.出现故障现象的MySQL服务器 …

    Tagged as : 笔记 故障
  7. Xhprof安装与使用

    前两天遇到一个PHP代码的bug,分析的结果是:因为要处理的数据量过大,内存分配超出了限制(php.ini中配置项memory_limit,默认是128M)。长期使用Python/PHP做Web开发,对于内存使用关注较少,这个事情让我重新关注起代码的内存占用问题,所以为工作中使用的测试开发环境配置Xhprof,进行性能数据收集分析(注:我们项目是用PHP开发的)。之所以选择Xhprof,是因为比较轻量,对性能影响较小,甚至可以一定方式用于生产环境,安装使用也方便。

    安装

    Xhprof是一个PHP扩展,安装方式与一般PHP扩展一致。

    1.从这里下载最新的源码包。假设解压缩后的文件夹为xhprof

    2.编译安装

    cd xhprof/extension
    /path/to/php/bin/phpize
    ./configure --with-php-config=/path/to/php/bin/php-config
    make
    make install …
    Tagged as : PHP 笔记 Xhprof
  8. Yii源码阅读笔记 - 错误/异常处理

    概述

    PHP区分“错误”(Error)和“异常”(Exception)。“错误”通常是由PHP内部函数抛出,表示运行时问题,当然也可以通过函数trigger_erroruser_error抛出一个用户级别的error/warning/notice信息。但在引入面向对象之后,相比使用trigger_error抛出错误,使用throw抛出异常更常用。

    对于“错误”,PHP允许配置报告哪些级别/类型错误、是否(向用户)展示错误、是否对错误记录日志、错误日志记到哪,分别对应php.ini中的配置项:error_reportingdisplay_errorslog_errorserror_log。详细信息见这里

    对于应用程序内层调用抛出的“异常”,一般可以在外层中使用try...catch来捕获并自定义处理过程。但对于“错误”(PHP运行时抛出或者应用程序使用trigger_error抛出的)或者对于-无法使用try...catch来捕获可能的异常/为了做到即使忘记捕获的异常也能得到自定义处理-的情况,该怎么办 …

    Tagged as : PHP Yii 笔记 总结

Page 2 / 16