1.背景及概述

1.1 背景

在做NFV的过程中,由于控制面进程被放置到不同虚拟机中,中间可能跨越路由器,因此期间网络有可能震荡,这种情况下保证高可用性就必须有保护机制,本文正是在这种背景下的考虑。

1.2 概述

原理其实很简单,有两个原则,一是这种保护机制不能让业务感知,二是尽可能简单。

2. 详述

2.1 正常交互

(1)源进程发送消息给目的进程

(2)目的进程回应消息给源进程

注意的是这些应该封装成公共库,以便复用。

2.2 异常交互

异常交互为两个方面,一是上述msg由于震荡被丢或被严重延时,二是ack由于震荡被丢弃或被严重延时。

2.2.1 msg异常

1)被丢,需要重传,为了保证唯一,需要加入进程1的id(记为clientid)、消息id(本进程唯一,且递增,记为msgid)、发送时间send_time。此外,需要设定重传interval、次数times。这些依然可能被丢弃,则应该通知源进程,所以这里应该有一段buff,用来唯一标识源数据(建议除正常id外,包括时间戳)。

2)被延时。除重传外,上次发送的消息的应答应该丢弃。

2.2.2 ack异常

1)被丢,则msg会被重发,重发时目的进程应该重新回复,若关联数据已不存在,则由目的进程业务做相关处理(如发送删除等)。

2)被严重延时。源进程重发,目的进程不论如何要回复。

2.3 总结及综述

(1)公共库的消息应该包含clientid、msgid、send_time,并设定interval、times,提供短buff(如64字节);

#define MAX_STORED_MSG 1000

#define MAX_BUFF_LEN 64

typedef unsigned int uint32;

typedef unsigned char byte;

typedef VOID (*send_fail_callback)(byte *user_buff);

typedef struct

{

uinit32 clientid;

uinit32 msgid;

uinit32 send_time;

byte times;

byte pad[3];

} MSG_T;

BOOL send_msg(byte *msg, uinit32 msg_len, const byte *user_buff, uinit32 user_buff_len);

(2)公共库lib有一个定时器,interval/2时间扫描重传链;

(3)发送消息挂在重传链中;

(4)若无回应,则更新发送时间后重传;

(5)若重传X次(如10次)后,回掉业务进程send_fail_callback。

(6)接收端若收到interval之前的消息,则丢弃。

(7)收到后立刻回应ack,clientid、msgid应与源消息相同,更新send_time。

(8)接收端若收到重复msg,与(6)处理相同重复回应,但要更新send_time。

(9)源端收到interval之前发送的ack,则丢弃。

NFV一种提高进程消息高可用性的方法的更多相关文章

  1. 【Android】一种提高Android应用进程存活率新方法

    [Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...

  2. 一种提高Android应用进程存活率新方法

    一.基础知识 1.Android 进程优先级 1.1 进程优先级等级一般分法:- Activte process- Visible Process- Service process- Backgrou ...

  3. 26种提高ASP.NET网站访问性能的优化方法 .

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池 ...

  4. 几种Windows进程通信

    32位Windows采用虚拟内存技术使每个进程虚拟4G内存,在逻辑上实现了对进程之间数据代码的分离与保护.那么相应的进程之间的通信也就有必要整理掌握一下. Windows进程间通讯的方法有很多:管道. ...

  5. 自己实现一个Electron跨进程消息组件

    我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...

  6. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  7. AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由)

    AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由) 在AspNetWebApi管线中存在两种类型的消息处理程序(Message Handler) 1.全局消息处理程序,所有的请 ...

  8. [No0000191]7种提高工作效率的Vim操作-Vim使用技巧(6)

    Vim一直被认为是一种非常高效的文本编辑器,但是对于普通用户来说,很难在入门的时候就体会到Vim的所谓高效性. 本文介绍7种提高你工作效率和生产力的Vim使用技巧,主要集中在对某个文件范围内的特定目标 ...

  9. Delphi 7里Messages.pas里所有104种重定义消息种类,180种不同的消息名称

    Delphi 7里Messages.pas里所有消息.经统计,共104种重定义消息种类,方便使用,180种不同的消息名称.省得像VC里一样,处处自己解析wParam和LParam参数进行分析.有空我要 ...

随机推荐

  1. sql server 日志文件结构及误操作数据找回

    一. 概述 在sql server 里有数据文件.mdf和日志文件.ldf,日志文件是sqlserver数据库的另一个重要组成部分,日志文件记录了所有事务以及每个事务对数据库所做的修改.为了提高数据库 ...

  2. sql server 索引阐述系列五 索引参数与碎片

    -- 创建聚集索引 create table [dbo].[pub_stocktest] add constraint [pk_pub_stocktest] primary key clustered ...

  3. mysql 开发基础系列8 表的存储引擎

    一. 表的存储引擎 1. 概述 插件式存储引擎是mysql数据库最重要的特性之一, 用户可以根据应用的需要选择如何存储和索引数据,是否使用事务等.在mysql 5.0里支持的引擎包括: MyISAM, ...

  4. Android数据保存之文件保存

    前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以k ...

  5. Dependency injection in .NET Core的最佳实践

    我们知道依赖注入(DI)是一种实现对象及其协作者或依赖关系之间松散耦合的技术. ASP.NET Core包含一个简单的内建容器来支持构造器注入. 我们试图将DI的最佳实践带到.NET Core应用程序 ...

  6. DRDS SQL 审计与分析——全面洞察 SQL 之利器

    背景 数据库存储着系统的核心数据,其安全方面的问题在传统环境中已经成为泄漏和被篡改的重要根源.而在云端,数据库所面临的威胁被进一步的放大.因此,对云数据库的操作行为尤其是全量 SQL 执行记录的审计日 ...

  7. php-fpm无法使用系统环境变量的解决方法

    为了防止任意环境变量到达php-fpm进程,默认默认php-fpm是会清空系统环境变量的, 解决办法 修改php-fpm配置的clear_env = no (默认是yes)

  8. Ubuntu 18.04.1 搭建Java环境和HelloWorld

    一.搭建Java环境 系统环境 Ubuntu 18.04.1 JDK 8 IDEA 2018.2 1.下载JDK 官网地址:http://www.oracle.com/technetwork/java ...

  9. ZooKeeper系列(6):ZooKeeper的伸缩性和Observer角色

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk 1.ZooKeeper中的角色 在比较老的ZooKeeper版本 ...

  10. 了解golang的可变参数(... parameters),这一篇就够了

    在实际开发中,总有一些函数的参数个数是在编码过程中无法确定的,比如我们最常用的fmt.Printf和fmt.Println: fmt.Printf("一共有%v行%v列\n", r ...