跑步近况:准备广州马拉松

最近这几周,具体是九月的一整月和十月初,都没怎么跑步。客观原因主要有两个:

  • 我换工作了
  • 我结婚了

关于跑步的好消息也有一个,那就是报名十二月份的广州马拉松,中签了。广马麻烦的地方有两个:

  1. 需要抽签
  2. 报名有资格要求:必须有以往参加过马拉松比赛的经历

第一个条件很正常, 很多有名气的马拉松都是要抽签的,因为人满为患嘛。第二个条件却引起骂声一片,因为涉及到鸡生蛋还是蛋生鸡的问题,很多广州本地人,就想在自己的城市参加第一次马拉松,却没有资格。

我们来拍拍肩吧:《百元之恋》观后感

《百元之恋》讲述了迷茫、堕落的一子,在经历各种屈辱、挫折之后,选择学习拳击的故事。

豆瓣对该电影的类型归纳为“剧情、喜剧、运动”,说是剧情和运动片无可厚非,但喜剧二字却让人啼笑皆非。电影前大半段都是弥漫着压抑、颓废甚至绝望的气氛,最后小半段转向奋进、激昂。跟喜剧八竿子打不着。

女性、拳击、失败,这些关键词不由让人们想到伊斯特伍德的《百万美元宝贝》,珠玉在前,其实这部电影想拍的出彩,还是挺难的。但看完电影之后,不得不说,它做到了。

那么,它吸引人的地方在哪里呢?我认为主要在于两个字,真实。

因为真实,所以能让观众产生很强的共鸣。

当一子在半夜骑着辆在路边顺来的自行车去超市时,我想到了,曾经有段时间我在床上一躺躺一整天,晚上饿的要晕了,晃晃悠悠爬起来去学校超市买东西吃。在昏黄的路灯下,没有什么比行尸走肉这个词更贴切了。

nginx proxy_cache 与 etag 配合的问题

首先谈谈遇到的问题:

一个 Nginx 架在一个后端服务的前面,Nginx proxy_pass 到它并开启 proxy_cache,假设这个后端服务总是会吐 Etag 响应头。

在应用中,我们发现当 Nginx 的 proxy_cache 成功将后端的页面 cache 住时,浏览器多次对该页面发起请求,会命中 Nginx 的 cache,但即使浏览器请求带了 If-None-Match 请求头,Nginx 却不会响应 304,而是响应200。

这样带来的问题是,即使 Nginx 的 cache 将请求阻挡在后端应用之外,但是:

  1. 命中后每次响应 200 导致 Nginx 所在的服务器和客户浏览器双方都有流量损耗
  2. 更重要的是增长了服务响应时间。因为,如果是304的话,nginx不需要向浏览器吐数据,只用告诉浏览器用本地的缓存就好了。

Nginx 中的进程间通信

我们知道,Linux 提供了多种进程间传递消息的方式,比如共享内存、套接字、管道、消息队列、信号等,每种方式都各有特点,各有优缺点。其中 Nginx 主要使用了其中的三种方式:

  • 套接字(匿名套接字对)
  • 共享内存
  • 信号

本文主要结合代码讲一下前两种方式,匿名套接字对和共享内存在 Nginx 中的使用。

1. Nginx 中的 channel 通信机制

1.1 概述

首先简单的说一下 Nginx 中 channel 通信的机制。

Nginx中的 channel 通信,本质上是多个进程之间,利用匿名套接字(socketpair)对来进行通信。

我们知道,socketpair 可以创建出一对套接字,在这两个套接字的任何一个上面进行写操作,在另一个套接字上就可以相应的进行读操作,而且这个管道是全双工的。

进程间传递文件描述符

首先,必须声明,“进程间传递文件描述符”这个说法是错误的。

在处理文件时,内核空间和用户空间使用的主要对象是不同的。对用户程序来说,一个文件由一个文件描述符标识。该描述符是一个整数,在所有有关文件的操作中用作标识文件的参数。文件描述符是在打开文件时由内核分配,只在一个进程内部有效。两个不同进程可以使用同样的文件描述符,但二者并不指向同一个文件。基于同一个描述符来共享文件是不可能的。
《深入理解 Linux 内核架构》

这里说的“进程间传递文件描述符”是指,A 进程打开文件 fileA,获得文件描述符为 fdA,现在 A 进程要通过某种方法,根据 fdA,使得另一个进程 B,获得一个新的文件描述符 fdB,这个 fdB 在进程 B 中的作用,跟 fdA 在进程 A 中的作用一样。即在 fdB 上的操作,即是对 fileA 的操作。