当前位置: 首页 > 知识库问答 >
问题:

字段标签可以从协议/节俭消息中删除吗?

高运诚
2023-03-14

我了解Prorobuf/Steft需要独特的数字字段标记来提供版本兼容性。他们通过以下方式序列化消息(某种)来提供版本兼容性:

<代码>

反序列化时,他们拾取标签值,查找消息模式,并知道将值填充到哪个字段中。这样,只要我们添加具有不同标签值的新字段,消息就会兼容。

但我认为这不是一个很好的设计:

>

  • 标签值必须在消息中编码。这有一些开销。

    例如当客户端多次调用远程服务器上的RPC方法时,每个请求/响应中的标记值都是相同的。只发送<代码>

    在更改字段类型时,我们还需要更改标记值。忘记这样做会导致错误。

    开发人员必须确保标记值是唯一的。通常,人们会跟踪最后使用的标记id,并在添加新字段时增加它。但当两个人在不同的分支中添加字段并进行合并时,很难解决冲突。

    我认为更好的设计可能是:

    为每种消息类型创建一个紧凑的架构,如下所示:

    <代码>

    为了解决问题1,在做任何事情之前交换消息模式。对于RPC示例,客户端将在发送第一个RPC之前发送其消息模式,然后在下面的RPC中,它只发送

    为了解决问题2,当字段类型更改时,压缩消息模式也将更改。程序将能够发现新旧模式不匹配,并报告错误。

    为了解决问题3,开发人员不再需要负责分配唯一的标记值。他们仍然需要注意分配唯一的字段名,但这应该更容易,并且不太可能导致合并冲突。

    这是一个可用的设计吗?那会有什么问题呢?


  • 共有1个答案

    袁翰池
    2023-03-14

    我相信Apache Avro的工作原理与您描述的一样,所以您可能应该试试。

    然而,我认为,预先的模式协商给协议增加了大量的复杂性,这超过了任何好处。在简单的情况下,这似乎很容易,但在一个大型系统中,如果您有代理(不知道代理是什么)、专用存储服务器、由来自多个具有不同协议版本的发送方的消息组成的消息等,那么跟踪模式版本的复杂性将成为一个巨大的负担。

     类似资料:
    • 消息协议 节点之间通过消息来进行交互,所有消息都由下面的数据结构来实现。 message Message { enum Type { UNDEFINED = 0; DISC_HELLO = 1; DISC_DISCONNECT = 2; DISC_GET_PEERS = 3; DISC_PEERS = 4;

    • 问题内容: 我一直在获取以下堆栈跟踪信息,并且不确定这意味着什么。 “协议消息端组标签与预期标签不匹配”是什么?意思? 什么是“消息端组标签”? 这是在某处记录的吗? 问题答案: protobuf中的组被写为开始/结束数字对-有点像需要a ,但是格式不同。本质上,它抱怨它找到了一个替代项(只是:xml只是一个隐喻)。详细信息在编码规范中,但总的来说是以下之一: 数据本身是损坏的(由于错误的编码器造

    • 我有一个简单的留言板,比方说:mywebsite.com,允许用户发布他们的消息。目前,董事会使所有链接可点击,即当有人发布以以下开头的内容时: 然后脚本自动将它们作为链接(即添加A href...标签)。 问题-有太多的垃圾邮件。所以我的想法是自动删除上面的超文本传输协议|s/www,这样这些就不会成为“可点击的链接”然而,我想让海报链接到我的网站内的页面,即不删除超文本传输协议|s/www当消

    • 问题内容: 是否有从Java字符串中删除HTML的好方法?一个简单的正则表达式 会起作用,但是不会正确转换,并且两个尖括号之间的非HTML也会被删除(即,正则表达式中的将会消失)。 问题答案: 使用HTML解析器代替正则表达式。对于Jsoup来说,这简直太简单了。 Jsoup还支持对可定制的白名单,如果你希望只允许例如这是非常有用的去除HTML标签,和。

    • 问题内容: 嘿,我需要删除字符串中的所有图像,但我找不到正确的方法。 这是我尝试过的方法,但是不起作用: 有任何想法吗? 问题答案: 尝试将放到的前面。 编辑:我刚刚测试了您的正则表达式,它工作正常。这是我使用的: 结果是:

    • 问题内容: 我遇到了WordPress模板的轻微编码问题。这是我在模板中使用的代码: 在我的函数中,我使用它来剥离标签并仅从允许的标签中获取内容。 问题:我使用上面的代码从内容中剥离了标签,但是WordPress已经将图像标签放在段落中。因此结果是空段标记,其中图像被剥离。 只是为了清理我的代码和无用的空标签。我的问题是如何删除空的段落标签? 在此先多谢!:) 问题答案: 使用此正则表达式删除空的