聊天服实现设计

聊天服拓扑关系

  1. 聊天服独立于游戏服,客户端直连聊天服
  2. 客户端按 PlayerID 散列,连接聊天服
  3. 有涉及扣道具才能发言的等(必须依赖游戏服功能的),先走游戏服,其他均可以直接走聊天服

聊天频道 - 世界频道

  1. 客户端请求游戏服,发送世界频道聊天
  2. 检查 CD 、 扣道具
  3. 游戏服请求所有聊天服发送一条世界频道消息
  4. 聊天服按批次给玩家发送世界频道消息

类似的,系统频道

聊天频道 - 附近频道

  1. 游戏服获取 PlayerID 集合
  2. 游戏服根据散列算法得若干个 PlayerID 子集合,发送给对应的聊天服
  3. 对应聊天服按 PlayerID 子集合,给对应玩家发送消息

私聊

  1. 聊天赋独立 DB 保存离线消息、私聊历史
  2. 玩家给聊天服发送私聊
  3. 聊天服根据散列算法,把消息投递到对应聊天服
  4. 对应聊天服给目标玩家发送消息或保存离线消息
  5. 玩家登录从聊天服获取离线消息
  6. 玩家可以通过聊天服获取私聊历史

组队聊天

类似还有公会聊天、好友群组聊天

  1. 游戏服需要把组队相关事件,转化为对应聊天服对应群组管理 API 调用
  2. 聊天服把群组信息存 DB
    • 组队时效性短可以用 Redis + LRU 缓存
    • 公会、好友群组可以用 MySQL + LRU 缓存
    • 群组都要有 UUID ,散列聊天服
  3. 玩家给聊天服发送群组消息
    • 聊天服转发给对应的聊天服
  4. 聊天服获取 PlayerID 集合
  5. 聊天服根据散列算法得若干个 PlayerID 子集合,发送给对应的聊天服
  6. 对应聊天服按 PlayerID 子集合,给对应玩家发送消息
  7. 聊天服需要存储群组聊天历史、玩家获取历史记录功能

玩家是否在线

  • 群组聊天,玩家获取群组信息,需要显示是否在线
  • 聊天服群发消息时,可以根据玩家是否在线,减少发送消息量

因此:

  • 聊天服定期同步自身有哪些玩家给其他聊天服
    • 其他聊天服上的群组,可以根据这信息确定这些玩家在线
    • 群组成员维护心跳时间,可以确定玩家已经下线
  • 聊天服重启,或遇到 LRU 缓存中无的群组,LRU 缓存后,聊天服可以慢速向其他聊天服询问某玩家是否在线

是否需要引入消息队列 Kafka

  • 一般不需要
  • 如果聊天服消息处理不过来,再引入 Kafka
  • 重构的代码很少
    • 原来聊天服给其他聊天服转发消息的地方,改为向 Kafka 发送消息
    • 原来监听处理其他聊天服到来的消息的地方,改为从 Kafka 消费消息

哈希算法定位玩家路由

用哈希算法做玩家-聊天服的路由,是最轻量。但是对于聊天服失效、扩容、缩容需要做些而外的处理

(如果感觉复杂,可以把路由信息所有聊天服同步、全量路由副本)

额外处理:

  • 如果是私聊,聊天服返回 MOVE 消息,玩家需要重新连接新聊天服
  • 玩家与聊天服定期心态,聊天服返回 MOVE 消息,玩家需要重新连接新聊天服

这样机制,失效、扩容、缩容时,玩家可能会丢失 1 个心跳期间的消息,但是不重要可以接受

  • 世界频道聊天这种消息会丢失
  • 私聊离线消息特做的不会丢失
  • 群组聊天历史消息,不会丢失
  • 组队聊天这种无历史消息的,会丢失最大 1 个心跳期间的消息

多个区公用聊天服

  • 聊天服上的玩家,多一个容器组织:区-玩家列表
  • 聊天服上的玩家,多一个容器组织:玩家-区ID

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文辅导 | 基于多尺度分解的LSTM⁃ARIMA锂电池寿命预测

辅导文章 模型描述 锂电池剩余使用寿命(Remaining useful life,RUL)预测是锂电池研究的一个重要方向,通过对RUL的准确预测,可以更好地管理和维护电池,延长电池使用寿命。为了能够准确预测锂电池的RUL&…

待研究课题记录

最近了解到两个新的有趣的节点,但是对于实际效果不是很确定,所以这里记录下,后续慢慢研究: 扰动注意力引导 Perturbed Attention Guidance GitHub - KU-CVLAB/Perturbed-Attention-Guidance: Official implementation of "…

默认导出(default)和命名导出

1.默认导出 优点: 简洁的导入语法: 导入时不需要使用花括号,可以直接重命名。单一职责: 模块导出一个主要功能或对象时,默认导出更符合逻辑。 适用场景: 模块只有一个导出: 如一个组件、一个…

CTS单测某个模块和测试项

1 &#xff0c;测试单个模块命令 run cts -m <模块名> 比如&#xff1a;run cts -m CtsUsbTests模块名可以从测试报告中看&#xff0c;如下&#xff1a; 2&#xff0c; 测试单个测试项 run cts -m <模块名> -t <test_name> 比如&#xff1a;run cts -m ru…

Linux程序地址空间

1. 进程地址空间 简单来说&#xff0c;就是从高地址往低地址&#xff0c;内存分区分别是&#xff1a; 内核空间&#xff1a;命令行参数argv和环境变量env等栈区&#xff1a;大部分局部变量&#xff0c;栈区内存往低处增长堆区&#xff1a;用于动态内存管理&#xff0c;堆区内存…

C # @逐字字符串

逐字字符串 代码 namespace TestAppConsole {class program{static void Main(string[] args){int a 0;int b 9;string c "2ui923i9023";//Console.Write(sizeof(int));string d "\t8282jjksk";string e "\t8282jjksk";Console.WriteLine(…

Java——继承(Inheritance)

一、继承简要介绍 1、继承是什么 在Java中&#xff0c;继承是一种面向对象编程的重要特性&#xff0c;它允许一个类&#xff08;子类或派生类&#xff09;继承另一个类&#xff08;父类或基类&#xff09;的属性和方法。继承的目的是实现代码的重用和设计的层次化。 子类通常…

LT8711GX 国产芯片 Type-C/DP1.4转HDMI2.1 用于加密狗 对接站

描述 LT8711GX是一款高性能的Type-C/DP1.4到HDMI2.1转换器&#xff0c;设计用于将USBType-C源或DP1.4源连接到HDMI2.1收发器。 该LT8711GX集成了一个符合DP1.4标准的接收器和一个符合HDMI2.1标准的发射器。此外&#xff0c;还包括一个CC控制器&#xff0c;用于CC通信&#xff0…

知名的以图叙事开源平台和工具

以图叙事是一种通过图表和图形来讲述故事或传达信息的方式&#xff0c;使复杂的数据更易于理解和更有吸引力。以下是一些知名的开源平台和工具&#xff0c;可以帮助你创建以图叙事的精彩内容&#xff1a; 1. StoryMapJS 描述: 一个简单的工具&#xff0c;用于创建由位置驱动的…

使用kali Linux启动盘轻松破解Windows电脑密码

破解分析文章仅限用于学习和研究目的&#xff1b;不得将上述内容用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。谢谢&#xff01;&#xff01; 效果展示&#xff1a; 使用kali Linux可以轻松破解Windows用户及密码 准备阶段&#xff1a; &#xff08…

洪水灾害的数据分析与预测

洪水是暴雨、急剧融冰化雪、风暴潮等自然因素引起的江河湖泊水量迅速增加&#xff0c;或者水位迅猛上涨的一种自然现象&#xff0c;是自然灾害。洪水又称大水&#xff0c;是河流、海洋、湖泊等水体上涨超过一定水位&#xff0c;威胁有关地区的安全&#xff0c;甚至造成灾害的水…

探索C++新特性:深入理解Lambda表达式

C不断演进&#xff0c;引入了新的特性和改进&#xff0c;使得语言更强大、更具表达力。其中&#xff0c;C11引入的Lambda表达式是最具影响力的特性之一。这个特性将匿名函数的能力带入C&#xff0c;允许开发者编写更简洁和清晰的代码。在这篇博客中&#xff0c;我们将探索C中的…

ASP.NET Core 使用Log4net

1. Nuget安装log4net&#xff0c;图里的两个 2.项目根目录下添加log4net.config.添加下面的代码: <?xml version"1.0" encoding"utf-8"?> <configuration><!-- This section contains the log4net configuration settings --><log…

C语言之常用内存函数以及模拟实现

目录 前言 一、memcpy的使用和模拟实现 二、memmove的使用和模拟实现 三、memset的使用和模拟实现 四、memcmp的使用和模拟实现 总结 前言 本文主要讲述C语言中常用的内存函数&#xff1a;memcpy、memmove、memset、memcmp。内容不多&#xff0c;除了了解如何使用&#x…

细说MCU的ADC模块单通道连续采样的实现方法

目录 一、工程依赖的硬件及背景 二、设计目的 三、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、配置ADC 4、配置系统时钟和ADC时钟 5、配置TIM3 6、配置串口 四、代码修改 1、重定义TIM3中断回调函数 2、启动ADC及重写其回调函数 3、定义用于存储转换结果的数…

WHAT - SWR(stale-while-revalidate)HTTP 缓存失效策略 - 请求方案

目录 介绍传统数据请求的 React 代码示例SWR 的 React 代码示例SWR 的优势和不同之处 可复用组件真实示例特性解读自动重新请求1. 聚焦时重新请求2. 定期重新请求3. 重新连接时重新请求 条件数据请求1. 按需请求2. 依赖请求 数据更改1. 乐观更新2. 在数据更改后更新缓存3. 基于…

一个pdf分割成多个pdf,一个pdf分成多个pdf

在数字化办公和学习中&#xff0c;pdf格式因其良好的兼容性和稳定性而受到广泛欢迎。但有时候&#xff0c;我们可能需要将一个大的pdf文件分割成多个小文件&#xff0c;以便于分享、打印或编辑。今天&#xff0c;我就来教大家几种简单有效的方法&#xff0c;让你轻松实现pdf文件…

基于Wireshark和TiWsPC(Wireshark Packet Converter)的Zigbee抓包

前言 介绍几种Zigbee抓包方式&#xff1a; 1. Ubiqua 使用教程网上非常多也非常清晰&#xff1b; 但是Ubiqua是收费软件&#xff0c;较贵&#xff1b; 我安装过了&#xff0c;费好多事&#xff0c;没安装成功。 2. Killerbee套件 https://github.com/riverloopsec/killerbe…

WACV2023论文速览域迁移Domain相关

Paper1 CellTranspose: Few-Shot Domain Adaptation for Cellular Instance Segmentation 摘要原文: Automated cellular instance segmentation is a process utilized for accelerating biological research for the past two decades, and recent advancements have produc…

Ad-hoc命令和模块简介

华子目录 Ad-hoc命令和模块简介1.概念2.格式3.Ansible命令常用参数4.模块类型4.1 三种模块类型4.2Ansible核心模块和附加模块 示例1示例2 Ad-hoc命令和模块简介 1.概念 Ansible提供两种方式去完成任务&#xff0c;一是ad-hoc命令&#xff0c;一是写Ansible playbook(剧本)Ad-…