作者:AnibalPinto 译:徐轶韬
MySQL团队除了使用新功能为MySQL复制进行强化,还对内部进行了改进。这需要大量工作来使代码库现代化,并使其更易于维护和扩展。
在MySQL 8.0.18中,我们使用群组复制消息传递服务扩展了内部服务集,因此形成了用于群组复制的通信框架。它允许群组复制插件以外的其它组件参与群组通信层。
MySQL服务允许插件访问服务器的功能,这是群组复制消息传递服务的基础,请查阅https://dev.mysql.com/doc/refman/8.0/en/plugin-services.html以获取有关服务设计的更多详细信息。
群组复制消息传递服务由两个服务组成:
消息类型由标记机制识别,一个不能包含mysql_前缀的字符串。
服务不知道要传输的负载的类型和内容,因此编码/解码负责其发送/接收。
如果没有注册任何接收者,服务不会报错,但是如果接收者返回错误,则该成员将离开该组,因为当一个成员无法处理消息时,群组复制不能保证一致性。
如果使用“群组复制”消息传递服务的模块需要与该组的所有成员进行通信,则需要确认所有成员都支持它。如果服务器具有早期的版本,它将丢弃未知消息,并且将无法使用发送服务。
我们打算在群组复制的所有成员之间创建一个IRC (Internet Relay Chat),做一些简单的事情,发送一条消息,联机成员就会收到它。
IRC模块将使用IRC作为标记来标识正在传输的消息。 订阅该服务将能够使用标签过滤消息。
要发送消息,必须获得发送服务并编写消息, 例如,发送带有标签“ IRC ”的 “ Hello World !! ”。
使用伪代码,可以将其实现为:
群组里所有ONLINE成员,甚至是发送消息的成员,都将收到该消息。然后,群组复制将看到订阅的模块,并通知有新消息。
使用伪代码,我们需要定义一个函数,该函数将在收到消息时由服务调用:
要将带有“ IRC”标签的消息打印到错误日志,我们可以:
并在服务上注册函数:
服务收到后,将验证标签是否正确并使用它。
如果您对这个话题有兴趣,甚至打算开发自己的MySQL扩展,您可以在文档中找到详细信息https://dev.mysql.com/doc/dev/mysql-server/latest/group__group__components__services__inventory.html。然后,下载代码来处理它。祝您玩得开心!
本文分享自 MySQL解决方案工程师 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!