4

我和我的一个朋友还有另一个争论。

考虑需要设计一个简单的基于 JSON 的协议,该协议基本上用于在各方之间发送某种事件(消息)。

说,像

 { event_id: 1, chat_message: "Hello" }
 { event_id: 2, group_id: 3, presence: "online" }
 ...

我建议像上面一样保留这个协议,而我的朋友建议做类似的事情:

 { event_id: 1, details: { chat_message: "Hello" } }
 { event_id: 2, group_id: 3, details: {  presence: "online" } }
 ...

他的论点是,就像 TCP 和 HTTP 处于不同的“责任”层一样,该协议应该使用“详细信息”子对象以保持数据分离。

他的另一个论点是处理匹配事件的处理程序不应该知道任何有关“路由”信息(例如 event_id)的信息。

我的论点是:

  1. 为了向处理程序隐藏这些信息,我们正在增加每条消息的长度(以及网络流量,这对于与大量消息交换的系统可能很重要)
  2. 处理程序确实需要知道“路由”信息,例如,才能正确回答它们:

    this.replyTo(event['event_id'], reply); // or...
    this.replyTo(event, reply); 
    
  3. 即使我们需要从处理程序中隐藏 event_id 和类似的东西,我们也可以在传递给处理程序之前将它们去掉,这样仍然可以节省流量

该协议非常简单,不应该被其他任何人使用。

你怎么

4

4 回答 4

4

在大型项目的长期经验之后,我必须强烈反对gahooaCharlie Martin的建议。敏捷方法和经典方法之间存在很大的张力。他们的建议看起来很敏捷,但我不能同意。如果你设计了一些东西,千万不要以你现在就知道是错误的方式来设计它。这不是敏捷,是愚蠢。我不敢相信您认为您的需求在未来不会改变,因此请保持开放并将重构影响降至最低。在您当前的设计中,当事件由不同的子系统作为事件类型调度程序 -> 路由器到组 -> 最终事件处理程序/存储或其他方式处理时,请保持每个子系统中的更改对彼此的影响最小。对我来说最好的负担是像洋葱皮芽这样的设计协议,不要将它设计到您当前要求之外的每一个细微细节上。它很敏捷。

你的论点:

广告 1. 这是过早的优化。如果您确实需要最小化流量,请改用二进制协议;-) ti 的其他成本/收益方式是错误的。

广告 2. 它适用于内部程序检测,而不是协议本身。这是错误的设计,尤其是在 Erlang 中。您的处理程序不应该直接返回到目的地,而是返回到保持套接字所有权和类似的某些路由器(通常返回到调度程序)。看起来又是过早的优化!

广告 3. 我更喜欢相反的方法。为子系统提供最小的数据集以最大程度地减少副作用,简化(单元)测试并避免使用第 2 点的方法。必要时延长。不要以相反的方式进行。

PS:为什么你不命名你的活动而是使用ID?再次过早优化?

编辑: Ids 被澄清,那些是事件编号但不是事件类。应该有另一个类键。

于 2009-02-20T10:26:45.183 回答
2

喜欢简单...

当您编写规范、分布式系统以及将在您无法控制的许多不同情况下使用的规范时,将需要适当性。

务实,通常最好使用“语言的力量”并编写代码来处理每种情况。除非你需要,否则不要抽象

把事情简单化。保持快速。保持干净。

您不知道它可能需要演变成什么(功能或性能),并且您拥有的抽象越多,重构就越困难。

于 2009-02-20T02:48:17.233 回答
2

曾几何时,当 ARPAnet 还很新,IP 还只是一个想法的萌芽时,有人说:“哦,天哪,一个 32 位 IP 地址就足够了——四十亿个地址?没有人会需要它。见鬼,我们可以将它们分成不同的地址类型,有足够的空间。”

25 年后,我们几乎不知道这将是一个问题。

甚至不要和我谈论域名命名。

关键是:你需要考虑什么可以改变。仅仅为了优雅而将其变成名称空间的层次结构是不必要且浪费的,而且当您的额外层不提供任何更多信息内容时,那何必费心呢。

另一方面,如果您这样做是为了使您的代码对问题的变化不那么敏感,或者使实现明显更容易或更不容易出错,那么它可能是值得的。

所以这就是你的答案:它只是为了更优雅,还是有其他优势?

于 2009-02-20T02:55:52.410 回答
0

这是两个正确的解决方案。如果您真的需要担心网络流量,您的解决方案是可以接受的。但是您还必须记住,代码维护占据了代码生命周期的大部分时间,因此今天让代码更干净,您将来可能会节省一些时间(已经提到过维护)。

在我看来,您应该有基于强有力事实的良好论据来考虑这种优化。

于 2009-03-08T09:30:12.393 回答