Articles by youngsterxyf

  1. 关于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
  2. 青云 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 : 笔记 工作 总结
  3. 又一次系统故障

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

    system-fault-err-page

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

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


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


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

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

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

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

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


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

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

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

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

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

    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 : 笔记 故障
  5. 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
  6. 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 笔记 总结
  7. 一行式并行方案(译)

    原文:Parallelism in one line

    译者:youngsterxyf

    在并行处理能力方面,Python的声名并不太好。不考虑关于线程和GIL(多数情况下是合理的)的标准论据,我认为Python中关于并行的真正问题并不是一个技术问题,而是教学问题。围绕Python线程和多进程的常见教程,一般都写得不错,但也令人乏味 - 激烈非凡,对日常真正有用的东西却很少涉及。

    沿袭的例子

    在DuckDuckGo(DDG)中搜索“Python多线程教程”,简单调查一下排在前面的结果,就会发现它们给出的都是同样基于Class + Queue的示例。

    介绍threading/multiprocessing、生产者/消费者的真实示例代码:

    # coding: utf-8
    # Example.py
    '''
    标准的多线程生产者/消费者模式
    '''
    
    import time 
    import threading 
    import Queue 
    
    class Consumer(threading.Thread): 
      def __init__(self ...
    Tagged as : PHP 翻译 并行
  8. 那些Python党踩过的PHP坑

    一看题目貌似本文要准备吐槽PHP,但遇到“坑”主要是因为个人经验不足。

    JSON反序列化 json_decode

    函数 json_decode 默认反序列化的结果是对象。Python党在做PHP开发用到这个方法时,很可能会跳进这个坑,认为结果应该是个数组,因为Python中json.loads返回的是一个字典。 json_decode 的第二个参数 $assoc 可用来指定反序列化的结果为数组。

    文档:http://php.net/manual/zh/function.json-decode.php


    数组序列化

    Python党初学PHP,可能类比于Python的列表和字典,认为PHP中明确区分索引数组和关联数组。但:

    PHP 实际并不区分索引数组和关联数组,都是一种有序映射。

    虽然很多时候索引数组和关联数组在表现上是不一样的,比如对以下两个数组进行序列化:

    <?php
    $arrA = array('a', 'b', 'c');
    echo json_encode($arrA) . "\n";
    
    $arrB = array('a ...
    Tagged as : PHP 笔记

Page 2 / 16