它们都提供大致相同的功能。我应该选择哪一个来开发我的高性能TCP服务器?什么是专业人士和缺点

参考链接:

Apache MINA

Netty

有帮助吗?

解决方案

虽然MINA和Netty有着相似的野心,但在实践中却有很大不同,你应该仔细考虑你的选择。我们很幸运,因为我们有很多MINA的经验,并且有时间和Netty一起玩。我们特别喜欢更干净的API和更好的文档。纸上的表现似乎也更好。更重要的是,我们知道Trustin Lee会随时回答我们的任何问题,他当然也是这样做的。

我们在Netty中发现一切都比较容易。期。虽然我们试图重新实现我们已经在MINA上使用的相同功能,但我们从头开始这样做。通过遵循优秀的文档和示例,我们在更多,更少的代码中获得了更多功能。

Netty Pipeline对我们来说效果更好。它在某种程度上比MINA更简单,其中一切都是处理程序,由您来决定是处理上游事件,下游事件,还是消耗更多低级别的东西。 “重放”中的吞噬字节解码器几乎是一种乐趣。能够如此轻松地即时重新配置管道也非常好。

但是,Netty的明星吸引力是能够创建具有“覆盖一”的管道处理程序。您可能已经在文档中已经阅读过这个coverage注释,但实际上它只是在一行代码中为您提供状态。没有混乱,没有会话映射,同步和类似的东西,我们只是能够声明常规变量(例如,“用户名”)并使用它们。

但后来我们遇到了障碍。我们已经在MINA下有一个多协议服务器,我们的应用程序协议通过TCP / IP,HTTP和UDP运行。当我们切换到Netty时,我们在几分钟内就将SSL和HTTPS添加到列表中!到目前为止这么好,但是当谈到UDP时,我们意识到我们已经滑倒了。 MINA对我们非常好,因为我们可以将UDP视为“连接”。协议。在Netty下,没有这样的抽象。 UDP是无连接的,Netty将其视为无关。 Netty在比MINA更低的级别上暴露了UDP的更多无连接特性。在Netty下你可以使用UDP做的事情比你在MINA提供的更高级别的抽象中所做的更多,但是我们依赖它。

添加“连接的UDP”并不是那么简单。包装或其他东西。鉴于时间限制以及Trustin的建议,最好的方法是在Netty实施我们自己的运输提供商,这不会很快,我们最终不得不放弃Netty。

因此,请仔细研究它们之间的差异,然后快速进入可以测试任何棘手功能的阶段,并按预期工作。如果你对Netty的工作表示满意,那么我会毫不犹豫地通过MINA。如果您从MINA迁移到Netty,那么同样适用,但值得注意的是,这两个API确实存在显着差异,您应该考虑对Netty进行虚拟重写 - 您不会后悔!

其他提示

MINA具有更多开箱即用的功能,但代价是复杂性和相对较差的性能。其中一些功能太紧密地集成到核心中,即使用户不需要它们也无法删除。在Netty,我试图解决这些设计问题,同时保留MINA的已知优势。

目前,MINA中提供的大多数功能也可在Netty中使用。在我看来,Netty拥有更清晰,更具记录性的API,因为Netty是试图从头开始重建MINA并解决已知问题的结果。如果您发现缺少必要的功能,请随时将您的建议发布到论坛。我很乐意解决你的担忧。

值得注意的是,Netty的开发周期更快。只需查看最新版本的发布日期。此外,您应该考虑MINA团队将进行重大改写,即MINA 3,这意味着他们将完全破坏API兼容性。

我的性能测试2“Google Protobuffer RPC”实现,其中一个基于Netty(netty-protobuf-rpc),另一个基于mina(protobuf-mina-rpc)。对于所有邮件大小,Netty最终持续更快(+ - 10%) - 这支持了Netty网站上的整体性能声明。由于您希望在使用此类RPC库时从代码中挤出所有效率,我最终编写了 protobuf-rpc-pro 基于Netty。我过去曾经使用过MINA,但是发现他们的2.0文件的文档有很大漏洞,并且API向后兼容性的破坏很大。

MINA和Netty最初是由同一作者设计和制作的。这就是为什么他们彼此如此相似。 MINA的设计略高,具有更多功能,而Netty更快一些。 我认为根本没有太大区别,基本概念是一样的。

在Netty网站中,您可以找到一些性能报告。正如所料:-)他们指出Netty是具有最佳性能的框架。

我从未使用过Netty,但我已经使用MINA来实现TCP协议。编码和解码的实现很简单,但状态机的实现并不那么容易。 MINA提供了一些类来帮助您实现状态机,但我发现它们很难使用。最后,我们决定放弃MINA并从头开始实施协议,令人惊讶的是我们以更快的服务器结束了。

我更喜欢Netty。

Twitter还选择了Netty来构建其新的搜索系统,并将其速度提高了3倍。

参考: Twitter搜索速度提高了3倍

  

我们选择Netty而不是其他竞争对手,比如Mina和Jetty,因为它有更清晰的API,更好的文档,更重要的是,因为Twitter上的其他几个项目正在使用这个框架。

我只使用MINA来构建一个像服务器这样的小型http。到目前为止我遇到的最大问题是:

  1. 它会保留您的“请求”和“响应”在记忆中。这只是一个问题,因为我选择使用的协议是http。您可以使用自己的协议来解决这个问题。
  2. 如果您想要提供大型文件,则无法提供磁盘流。再次可以通过实施自己的协议来解决
  3. 关于它的好消息:

    1. 可以处理很多连接
    2. 如果您选择实施某种分布式工作系统,那么了解其中一个节点出现故障并断开连接对于重新启动另一个节点上的工作非常有用。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top