轮询算法设计及其代码框架

在实际的软件开发项目中,经常会遇到某模块需要向其它模块发消息的情况。为了减轻消息接收者的负担,我们会采用一种叫做轮询的机制来发送消息。本文介绍轮询算法的流程及其代码框架。

1.算法流程

假设消息发送模块为模块A,消息接收模块为模块B。模块A安装了一个,模块B安装了N个。所有模块都同时启动。

算法流程如图1所示:

图1 轮询算法流程

2.代码框架

static int g_iSendIdx = 0;
for (iLoopFlag = 0; iLoopFlag < N; iLoopFlag ++)    // N为模块B的安装个数
{
    // 构造发往模块B的消息
    // 将消息发到模块B
    if (消息发送成功)
    {
        g_iSendIdx = (g_iSendIdx + 1) % N;    // 记录下次发送到哪个模块B
        break;
    }
    else     // 消息发送失败
    {
        g_iSendIdx = (g_iSendIdx + 1) % N;    // 记录下次发送到哪个模块B
    }
}

if (iLoopFlag >= N)
{
    // 发送失败, 不进行后续处理
}

// 继续处理下面的流程

对于轮询算法,大家需要注意的是:

(1) 该算法是为了解决消息接收者负荷过重的问题而提出的,如果消息量不大,可以直接采用一对一的模式。

(2) 对于消息发送成功的情况,一定要记录下次消息发送模块的标志。即如果当前向第一个模块B发消息成功,那么下次应该将消息发往第二个模块B。如此不断循环。



本人微信公众号:zhouzxi,请扫描以下二维码:

时间: 2024-10-21 02:26:13

轮询算法设计及其代码框架的相关文章

实现一个简单的轮询算法

前言 负载均衡,大家应该听的也不少了,也实践过N次了. 当然也会知道,负载均衡是有不少算法的:随机,轮询,加权轮询,最少连接.... 本文重点说的是轮询. 先举个例子看看轮询算法是如何运作的. 假设我们的API站点有3台负载(10.0.10.1,10.0.10.2和10.0.10.3),客户端第一次请求API的时候,会访问.1拿到结果,第二次会访问.2拿到结果,第三次则会访问.3拿到结果,后面就是依次类推. 在致就是这个样子的访问顺序. .1->.2->.3>.1>.2......

LVS负载均衡地址转换使用轮询算法实验(结尾代码随记)

地址转换模式:调度服务器有双网卡,做NAT映射,请求经过调度服务器, 也是各个节点服务器回应客户机的出口,可作用于私网,较安全. 实验思路及环境 一.调度服务器配置双网卡,做网关,请求的流量以及转发的流量走调度服务器走 二.资源服务器两台都提供网页服务,为了测试,两台的内容不相同ip:192.168.10.10/24 httpd服务ip:192.168.10.20/24 httpd服务 三.远程存储设备使用NFS做远程存储,给资源服务器提供内存支持 图解如下 1.安装ipvsadm包 yum i

轮询算法

在多台机器实现负载均衡的时候,经常用到轮询调度算法(Round-Robin Scheduling). 轮询调度算法就是以循环的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器. 算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度. 1.算法流程:假设有一组服务器 S = {S0, S1, -, Sn-1} ,有相应的权重,变量i表示上次选择的服务器,权值cw初始化为0,i初始化为-1 ,当第一次的时候取权值取最大的那个服

十四.nginx,web,反向代理,调用加权轮询算法,nfs服务

一.部署nginx反向代理web服务,调度算法使用加权轮询: 1.首先配置一个nginx服务端,三个web客户端.用vmware 新建虚拟机完成,并用xshell连接 2.在服务端和3个web客户端都下载epel_release 和nginx软件包; yum install epel_release -y ;  yum install nginx -y 3.关闭服务端和web客户端的防火墙,在服务端和web客户端都开启nginx软件包并且查看是否开启; 如未开启重新启动nginx: system

平滑加权轮询算法下的降权

func (this *LoadBalance) RoundRobinByWeight3() *HttpServer { //平滑加权轮询 for _, s := range this.Servers { s.CWeight = s.CWeight + s.Weight } sort.Sort(this.Servers) max := this.Servers[0] max.CWeight = max.CWeight - SumWeight return max } 来自为知笔记(Wiz) 原文

平滑加权轮询算法

static void Test1() { var sv = new ServerConfig[] { new ServerConfig{Name="A", Weight = 4}, new ServerConfig{Name="B", Weight = 2}, new ServerConfig{Name="C", Weight = 1} }; int index = 0; int sum = sv.Sum(m => m.Weight);

加权轮询算法

func (this *LoadBalance) RoundRobinByWeight() *HttpServer { server := this.Servers[ServerIndices[this.CurIndex]] this.CurIndex = (this.CurIndex + 1) % len(ServerIndices) //ServersIndices存放的是按照权重排放的索引,如3,1,2 则ServerIndices=[0,0,0,1,2,2] 然后遍历ServerIndi

# IT明星不是梦 #分布式负载均衡算法之亲和性轮询

无论是在早期的负载均衡器中,还是当前微服务基于客户端的负载均衡中,都有一个最基础的轮询算法,即将请求平均分布给多台机器,今天聊聊在此基础上, kube proxy是如何实现亲和性轮询的核心数据结构. 了解亲和性策略实现,失败重试等机制 1. 基础筑基 1.1 Service与Endpoints Service和Endpoint是kubernetes中的概念,其中Service代表一个服务,后面通常会对应一堆pod,因为pod的ip并不是固定的,用Servicel来提供后端一组pod的统一访问入口

java用while循环设计轮询线程的性能问题

java用while循环设计轮询线程的性能问题 轮询线程在开发过程中的应用是比较广泛的,在这我模拟一个场景,有一个队列和轮询线程,主线程往队列中入队消息,轮询线程循环从队列中读取消息并打印消息内容.有点类似Android中Handler发送消息. 首先定义一个Message类. public class Message { private String content; public Message(String content) { this.content=content; } public