关于后端:用-Pulsar-开发多人小游戏七用-Pulsar-Connector-制作全局计分板

26次阅读

共计 2335 个字符,预计需要花费 6 分钟才能阅读完成。

本文是《用 Pulsar 开发多人在线小游戏》的第三篇,配套源码和全副文档参见我的 GitHub 仓库 play-with-pulsar 以及我的文章列表。

上一章介绍了 Pulsar Function 的应用,每个游戏房间都有对应的 score topic,每个玩家的得分都会被发送到 score topic 中,游戏客户端通过读取这个 topic 的 tableView 来显示局内计分板。

但思考到一个玩家可能去过多个游戏房间进行游戏,所以咱们心愿可能对玩家在不同房间中的总分做一个统计,实现相似「全服排行榜」的性能。

想要实现这个全局计分板,简略间接的做法就是创立 Consumer 生产所有 {roomName}-score-topic 中的音讯,对每个玩家进行总分统计。不过这样搞比拟麻烦,每次计算全局分数都要从新计算一次。

毕竟 Pulsar 不是一个主打数据聚合和统计的零碎,所以我会思考把用户的分数信息导出到其余数据系统中,做进一步的剖析和统计。

因为咱们发送到 score Topic 中的音讯其实是键值对,键是 playerName-roomName 的模式,值是该玩家在该房间中取得的最新分数。

那么如果咱们能够把 {roomName}-score-topic 中的音讯存储到 Redis 中,就能够用 Redis 的 playerName-* 的模式拿到某个玩家在所有房间内的分数信息。而后对它们求和即可。

本文就以 Redis 举例,看看如何通过 Pulsar connector 性能将 Pulsar 中的数据主动导出到其余零碎

Pulsar connector 简介

先上官网文档链接:

https://pulsar.apache.org/doc…

connector 分两种,一种叫 source,另一种叫 sink。顾名思义,source 就是把数据从其余零碎导入 Pulsar 中,sink 就是把 Pulsar 中的数据导入到其余零碎中。

其实我了解 Pulsar connector 实质就是 Pulsar Function,这个 Function 持有了其余数据系统的客户端,作为 Pulsar 和其余零碎之间的桥梁罢了。

之前介绍 Pulsar Function 时说过,Function 有两种部署模式,能够独立部署为一个服务集群,也能够上传部署到 broker 上,所以 source 和 sink 也能够独立部署或者上传部署到 broker 上。稍后会看到,我会用 localrun 在本地启动一个 Redis sink connector,也就是独立部署的模式。

咱们想把 topic 中的数据导入 Redis,所以须要在 Pulsar build-in connector 的下载页面寻找 Redis sink connector,下载之后依照 Redis sink 的配置文档 操作即可。

首先在 Pulsar 的文件夹中创立一个 connectors 目录存储所有 Pulsar connector,并下载 Redis sink connector 到这个目录:

mkdir connectors
curl -O https://www.apache.org/dyn/mirrors/mirrors.cgi?action=download&filename=pulsar/pulsar-2.11.0/connectors/pulsar-io-redis-2.11.0.nar --output-dir ./connectors

部署 Redis Sink

咱们先在本地用 docker 启动一个 Redis 服务器:

docker pull redis:5.0.5
docker run -d -p 6379:6379 --name my-redis redis:5.0.5 --requirepass "mypassword"

咱们想把 Pulsar 外面的数据导入到 Redis 外面,所以得给出这个 Redis 服务的必要信息对吧,所以建设一个 redis-sink-config.yml 文件:

# Redis config
configs:
    redisHosts: "localhost:6379"
    redisPassword: "mypassword"
    redisDatabase: 0
    clientMode: "Standalone"
    operationTimeout: 2000
    batchSize: 1
    batchTimeMs: 1000
    connectTimeout: 3000

而后,咱们用 localrun 模式在本地启动一个 Pulsar Connect 服务,让它运行 Redis 的 connector,并且要通知它要从哪个 topic 读数据存储到 Redis 中:

bin/pulsar-admin sinks localrun \
    --archive connectors/pulsar-io-redis-2.11.0.nar \
    --tenant public \
    --namespace default \
    --name my-redis-sink \
    --sink-config-file redis-sink-config.yaml \
    --topics-pattern '*-score-topic'

这个命令在本地启动了 Redis sink connector,并且指定读取所有后缀为 -score-topic 的 topic 数据,存储到 Redis 中。

接下来,就能够通过以下 Redis 命令查问某个玩家的总分了:

eval "local keys = redis.call('keys',KEYS[1]) ; local sum=0 ; for _,k in ipairs(keys) do sum = sum + tonumber(redis.call('get',k)) end ; return sum" 1 'playName-*'

更多高质量干货文章,请关注我的微信公众号 labuladong 和算法博客 labuladong 的算法秘籍

正文完
 0