herm::cached 客户端与服务器协议一致性校验方法

Herm(一套快速开发高性能的网络应用的C++库) 1.1 什么是Herm Herm是一套快速开发高性能的网络应用的C++库。比如开发网络游戏、即时通信、流媒体、文件下载、P2P等基于TCP/IP网络应用。 Herm包括三个组件: (1)Utilities 最基础的组件,提供线程、一读一写线程不加锁的ring buffer、二进制消息解析器、支持多态的对象管理器等。 (2)Socket 用面向对象和泛型的方法抽象了TCP/UDP的Socket IOs;抽象了Win32 Select、Linux epoll和FreeBSD kqueue的多路复用API。统一了三者水平模式(Level Triggered)的语义(一套代码在Win32/Linux/FreeBSD运行结果是一样的),Linux上也支持了边缘模式(Edge Triggered)。 (3)Framework 基于Utilities和Socket的简化开发网络应用的框架,抽象出Peer和Session对象。Peer和Session对象以及Framework实现的功能将在第2章介绍。 Herm目前仅支持Linux/Windows/FreeBSD 32bits平台。调用者可以基于不同的需求使用不用的组件。 1.2 最简单的例子 本节给出两个分别用Framework和Socket组件实现的简单TCP Server的例子。所有的例子可以参考examples frameworks和multiplexors目录。 1.2.1 用Framework实现TCP Server 首先,实现一个Listener, class Listener : public Herm::Listener { virtual void Accept(Herm::Session* session) { // 在这里得到一个于客户端通信的Session // 注册用于处理收到的消息的handler // 用Session::Push将数据写到发送buffer,最终数据传给client } }; 实现一个App, class App : public Herm::App { virtual bool Init() { // 1. 创建Network Herm::Network* net = CreateNetwork(); // 2. 创建一个TCP Server Peer,将Listener注册到Peer,进行监听 Herm::Peer* peer = net->CreateTCPServer(addr, new Listener); } }; 1.2.2 用Socket实现TCP Server 用Socket实现TCP Server更灵活,但实现者要做一些额外的工作,比如tcp stream解析,缓冲队列处理等等。 首先实现一个AcceptHandler,处理Client连接, class AcceptHandler : public Herm::EventHandler { virtual int Receive(int) { m_acceptor->Accept(streamHandler->GetStream()); g_reactor->Register(streamHandler, Herm::READ_MASK); ... } private: Herm::Acceptor* m_acceptor; }; 实现StreamHandler, 处理数据收发, class StreamHandler : public Herm::EventHandler { // Handle onle int param on FreeBSD, pls see the example of FreeBSD_tcp_server virtual int Receive(int) { m_stream->Recieve(buf, .......); ..... } private: Herm::Stream* m_stream; }; 最后,在一个线程里把上面Handler执行起来, while (true) g_reactor->Run(); 1.3 Herm地址 https://sourceforge.net/projects/speed/ 1.4 下一章话题 下章将较详细地介绍Framework组件,主要介绍如何用Framework实现真实可用的网络游戏的接入网关Server(gated)和逻辑Server(zoned) 转自优快云的herm_lib http://blog.youkuaiyun.com/herm_lib 立即下载

cached根据protobuf的元数据机制去保存和读取数据库中的数据。

为了简化服务器交互的复杂度,逻辑服务器用的protobuf和cached的protobuf,数据结构要完全一致。

不一致的话,会出现不确定的错误。比如,逻辑服务器用Msg1序列化数据,传给cached, cached却用Msg2去解析,重组,保存到DB。结果就全乱了!

所以,逻辑服务器连接cached成功后,先要保证protobuf是一致的。

1. logicd从cached获取Message名字列表和所有Message的总MD5

    Message列表名字,每一个文件只须给出一个Message名字即可

    这些数据在cached启动的时候,一次性生成即可。

2. logicd根据返回的Message名字列表,反查Message所在文件的所有Message,算出总MD5,判断该MD5是否和返回的MD5一致。


关于MD5计算

cached和logicd计算过程不一样。

cached

cached的protobuf的对象都从proto文件导入,动态生成protobuf对象。

1. 通过Import获取DescriptorPool;

2. 通过DescriptorPool::FindFileByName(...)获取各个FileDescriptor;

3. 从FileDescriptor,计算出MD5,最后计算总MD5。


logicd

logicd的protobuf都是编译进来的,通过DescriptorPool::generated_pool()获取DescriptPool对象。后面步骤和cached一样。

-----------------------------------2015-4-29补充-------------------------------------

实际实现的时候,发现通过md5计算版本受字段的顺序之类影响,同时发现版本不匹配的时候,还没法定位差异。直接采用一个一个字段对比的方式了。

版本比较有两处地方,DB(MySQL)结构和cache服务器中的protobuf元数据,cache服务器和逻辑服务器的protobuf元数据。

版本比较非常重要,节点间版本不一致,会导致存储错误或者读取出来的数据错误。

    

libnat UDP穿透 udp 穿透功能实现的详细C++代码,可以作为P2P程序的基础库 立即下载

相关推荐

人工智能在高中教育中的应用现状剖析与挑战应对

人工智能在高中教育中的应用现状剖析与挑战应对

燕鹏 1340

服务器端校验(更重要)和客户端校验

struts2提供了两种校验方式:服务器端校验(更重要)和客户端校验 也分为:validate()校验方法、自定方法的义校验方法、校验框架校验方法三种,其中校验框架校验方法又分为两种:校验器优先校验器和字段优先校验器.(没有业务逻辑的校验) 1、通过validate()校验方法进行校验    我们只写错误的情况,正确的情况我们不做处理。 注意:struts2当输入校验发生错

奔跑在路上 6182

用Python手把手教你实现一个多层感知机(MLP)——从理论到代码实战

本文详细介绍了如何使用Python和Theano库从零开始实现多层感知机(MLP),涵盖从核心原理到代码实战的全过程。通过构建隐藏层、输出层和完整MLP模型,结合权重初始化、激活函数选择和训练技巧,帮助开发者深入理解神经网络工作机制,并应用于实际机器学习任务。

web39explorer的博客 970

C++ Protobuf接口参数自动校验实现方案

实现基本思路主要用到两个核心技术点:protobuf字段属性扩展和反射机制。首先针对常用的协议字段数据类型(int32、int64、uint32、uint64、float、double、string、array、enum)定义了一套最常用的字段校验规则,如下表:// int32类型校验规则// int64类型校验规则// uint32类型校验规则// uint64类型校验规则// float类型校验规则// double类型校验规则。

qq_15614599的博客 2064

STM32外部中断与事件机制深度解析:从硬件触发到软件响应

本文深入解析STM32外部中断与事件机制,从硬件触发到软件响应的完整流程。通过对比中断和事件的应用场景、响应速度及配置方法,帮助开发者优化嵌入式系统设计,特别适合需要低功耗或高实时性的项目。

weixin_29175469的博客 410

Win10安装Nek5000

1 安装wsl 2 2 安装Nek5000 3 安装依赖项 4 安装openmpi 5 配置Nek5000 6 编译Nek5000 7 运行Nek5000算例 8 安装paraview并查看结果

weixin_43176703的博客 3451

服务器和客户端TSL协议不一致

问题: javax.net.ssl.SSLHandshakeException: Server chose TLSv1, but that protocol version is not enabled or not supported by the client. connection reset           server使用TLSv1.2 client使用TLSv1

李猿外的博客 1万+

oracle19c 无备份情况下重建ocr 和 votedisk

无备份情况下重建ocr 和 votedisk – 19c 备注:测试环境基本上都有ocr自动备份文件,建议参考有备份情况下恢复ocr和votedisk Deconfigure and reconfigure entire cluster will rebuild OCR and Voting Disk, user resources (database, instance, service, ...

fangang001的专栏 4182

对Linux中cached和buffers的理解

Linux - free中cached和buffers用户空间在向内核发起内存申请时,会根据当前请求页面是否在内存缓存当中进行相应的策略调整.内核在内存当中会开辟一块缓冲区,用于提升读取页面的效率,否则就要进行相应的磁盘I/O读写. cached和buffers正是缓冲区中对应的两个不同区域,从字面上理解,感觉相差不大,以下说明下cached和buffers的意义.首先 通过 man free进行

harrypanda的博客 1982

【Zephyr电源与功耗专题】13_PMU电源驱动介绍

本文介绍的PMU芯片包含2路DCDC和6路LDO,在Zephyr实时操作系统下实现了完整的电源管理解决方案。

zero的博客 843

国科大学习资料--现代数字信号处理I(张颢)--2020年期末考试试卷

国科大学习资料–现代数字信号处理I(张颢)–2020年期末考试试卷 国科大学习资料–现代数字信号处理I(张颢)–2020年期末考试试卷 国科大学习资料–现代数字信号处理I(张颢)–2020年期末考试试卷 =========================================================================================================================================================

无名何许人的博客 3575

【RocketMQ工作原理】订阅关系的一致性

订阅关系的一致性指的是,同一个消费者组(Group ID相同)下所有Consumer实例所订阅的Topic与 Tag及对消息的处理逻辑必须完全一致。否则,消息消费的逻辑就会混乱,甚至导致消息丢失。 1 正确订阅关系 多个消费者组订阅了多个Topic,并且每个消费者组里的多个消费者实例的订阅关系保持了一致。 2 错误订阅关系 一个消费者组订阅了多个Topic,但是该消费者组里的多个Consumer实例的订阅关系并没有保持一致。 订阅了不同Topic 该例中的错误在于,同一个消费者组中的两个Consumer

LoveSummer 1623

YOLOv11知识蒸馏实战:让小模型拥有大模型90%精度,速度提升3倍的终极教程

在self.alpha = alpha # 蒸馏损失权重self.temperature = temperature # 温度系数,控制分布平滑度# 输出分布蒸馏(KL散度损失)# 中间特征蒸馏(MSE损失,对齐中间层特征)# 总蒸馏损失知识蒸馏是YOLOv11在“小模型高性能部署”场景的“破局之法”——它让小模型能“站在大模型的肩膀上”,兼具速度与精度。从损失函数定义到多阶段训练,再到实战落地,本教程已为你铺就了一条清晰的路径。

m0_64661770的博客 802

protobuf使用总结

protocol buffers使用总结。

weixin_47978762的博客 404

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

解决90%接口异常!Tonic数据验证:Protobuf字段校验最佳实践

你是否还在为gRPC接口频繁抛出无效数据错误而头疼?作为使用Tonic构建异步gRPC服务的开发者,数据验证是保障服务稳定性的第一道防线。本文将系统介绍Protobuf字段校验的全流程解决方案,从基础约束到高级拦截器模式,帮助你构建健壮的分布式通信系统。读完本文你将掌握: - Protobuf原生验证规则与Tonic集成方法 - 服务端请求校验的三种实现模式 - 错误处理与客户端反馈的最佳实践 -...

gitblog_00408的博客 1172

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

protobuf 生成validate

protobuf 可以通过插件实现请求参数的校验,并通过自定义middleware实现参数自动校验。

qq_37011724的博客 658

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

一些 protobuf 的复盘(一)—— C++写完后的验证

.

先说一下,就简单地写点儿氵文,不是博客,只是我的笔记本/工具书 625

Herm统一分发框架的分发各种对象的流程

<br />分发框架管理一个树状的Handlers,Handler分为通用的(general)和专有的(specific)。通用的Handler是为所有的对象服务;专有的Handler是为某个对象服务(常见的是Role)。框架结构描述如下:<br />        cmd1----->handlers<br />        cmd2----->handlers<br />        cmdN----->handlers<br />                                 +

daemonh 1943

Protobuf 中的类型检查

在使用protobuffer时,如果定义一个消息如下: enum my_enum { enum_type1 =1, enum_type2 =2 } message my_msg { required my_enum test_enum = 1 } 那么,在protoc生成的代码中,在赋值时 set_test_enum(const my_enum value) 的第一行代码会进行判断,判断value是否为对应的枚举数值,否则,会报错。 同时,在c++中,以前认识存在...

hit1524468的专栏 1424

java更改protobuf的值_protobuf java class 如何添加接口的数据校验?

我计划使用 springboot + protocol buffer + https 完成一个java后台,但是在使用protocol buffer做接口的数据交换的时候遇到了一个问题,似乎没法添加数据校验。以前自己在写JOPO的时候,可以使用hibernate validator进行数据校验。但是protocol buffer作为接口的数据交换格式的时候却没法找到这样的实现技术。我希望找到能够解...

weixin_39526459的博客 779

Protobuf简单使用及其抓包分析

早之前就用过Google的Protobuf做数据编码,一直没有深入理解其中的原理,最近做了一次通讯抓包,发现其中很多Protobuf编码的数据包,于是决定分析一下其中的数据包及其编码。一、Protobuf的使用首先来简单介绍一下Protobuf的使用,这里以windows下java开发为例,几个步骤:编写*.proto ->使用google提供的protoc.exe生成*.java->项目中导入p

wangqiuyun的专栏 4万+

md5检验本地和服务器包的一致性

md5 using

oochen_98的博客 1775

游戏服务器数据缓存和持久化中间件设计总结

http://blog.youkuaiyun.com/herm_lib/article/details/8171196 本文就介绍游戏服务器的数据缓存和持久化的设计策略。基本上各种类型的游戏服务器都适用,包括全区全服、分区分服的SNS类、ACG或者RPG。数据的缓存和持久化从技术角度来讲是比较容易实现?做过几个类似的功能模块后,渐渐地会有一种模块重用的想法,有一个公共的中间件可以容易支持我们游戏服务器各

daemonh 7143
上一篇: 系统配置相关记录
下一篇: MySQL常用操作记录
herm_lib
博客等级 码龄16年 173粉丝 115原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值