58 lines
2.8 KiB
Markdown
58 lines
2.8 KiB
Markdown
# 分布式服务器之间的数据同步
|
||
|
||
在了解了分布式技术假设服务器之后,如何在不同服务器之间共享数据,就成为了一个问题。
|
||
|
||
从插件数据的持久化部分来说,应该优先使用数据库,而不是本地文件进行数据保存。同时在需要时,对数据预先进行缓存。
|
||
|
||
开服工具2.0的服务器默认提供了3种数据库:MySQL、Redis、MongoDB。开发者可以根据自己的开发习惯和数据的格式,来选择更加合适的数据库来存储数据。如果自己更习惯的数据库不在这三者之中,也可以自行或联系机房技术人员在服务器上安装其他数据库。
|
||
|
||
## 持久化
|
||
|
||
数据在持久化上,应该优先考虑使用MySQL或MongoDB来进行数据存储。
|
||
|
||
推荐使用连接池来预先准备足够数量的连接,方便在需要时立刻取用。
|
||
|
||
可以使用的库例如
|
||
|
||
### MySQL
|
||
|
||
- [druid](https://github.com/alibaba/druid)
|
||
- [HikariCP](https://github.com/brettwooldridge/HikariCP)
|
||
|
||
### MongoDB
|
||
|
||
- [Mongo Java Driver](https://github.com/mongodb/mongo-java-driver/)
|
||
|
||
## 缓存
|
||
|
||
对于高频访问的数据,可以考虑使用内存或[Redis](https://redis.io/)进行存储,防止流量直击数据库,对数据库造成较大的压力。
|
||
|
||
对于Java,可以使用[Jedis](https://github.com/redis/jedis)或[redisson](https://github.com/redisson/redisson)来创建并管理Redis连接池。
|
||
|
||
> 例如[RedisBungee](https://github.com/minecrafter/RedisBungee)插件,就是利用Redis高速的特性,通过Redis存储BungeeCord之间的玩家在线数据,实现了数据同步。
|
||
|
||
## 分布式锁
|
||
|
||
在分布式服务器之间,经常会遇到需要争抢同一个资源的情况。
|
||
|
||
> 例如:交易市场功能
|
||
>
|
||
> 遇到此类情景时,经常会遇到多个用户同时争抢购买同一个商品的功能,为了防止同时对一个资源进行操作,推荐使用Redis提供的分布式锁的功能。在尝试交易之前,首先设置Redis的分布式锁,抢锁成功后,开始交易操作,交易完成释放锁。
|
||
|
||
具体操作方法可以参考[官方文档](https://redis.io/docs/manual/patterns/distributed-locks/)。
|
||
|
||
## 订阅/发布
|
||
|
||
Redis还提供了订阅发布功能,即Pub/Sub
|
||
|
||
如果要实现服务器之间的消息广播通信,可以依赖Pub/Sub来实现。
|
||
|
||
> 例如全服喊话功能,就可以在不同BC服之间订阅同一个频道来实现。
|
||
|
||
具体操作方法可以参考[官方文档](https://redis.io/docs/manual/pubsub/)。
|
||
|
||
## 消息队列
|
||
|
||
如果需要使用消息队列功能,新版本Redis也同样提供了Streams接口,来实现消息队列,具体可以参考[官方文档](https://redis.io/docs/data-types/streams-tutorial/)。
|
||
|
||
如果Redis无法满足你的需求,也可以自行或联系机房工作人员,安装其他消息队列中间件。 |