共计 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 的算法秘籍 。