以下文章来源于公众号 MySQL解决方案工程师
作者: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!
作者:AnibalPinto 译:徐轶韬

欢迎关注个人微信公众号;
长按以下二维码或公众号搜索“一森咖记”

往期精彩文章
=====================================




