由于曾经缺乏手撕源码的经验,这段时间从零开始一点点啃nginx源码实在是啃的过于痛苦,加之自己的代码水平实在有限,只能结合多方大佬的源码分析文章以及自己的“意会”,用自己能理解的大白话梳理一下我所理解的算法实现过程。
轮询算法的原理就不作叙述了,这里直接贴出每轮轮询中选出最后结果的方法ngx_http_upstream_get_peer的源码:
static ngx_http_upstream_rr_peer_t *
ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
{
time_t now;
uintptr_t m;
ngx_int_t total;
ngx_uint_t i, n, p;
ngx_http_upstream_rr_peer_t *peer, *best;
now = ngx_time();
best = NULL;
total = 0;
#if (NGX_SUPPRESS_WARN)
p = 0;
#endif
for (peer = rrp->peers->peer, i = 0; //peer表示当前服务器
peer;
peer = peer->next, i++)
{
//计算当前服务器的标记位在位图中的位置
n = i / (8 * sizeof(uintptr_t));
m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
//已经选择过,跳过
if (rrp->tried[n] &