Netty 与 Apache MINA

2023-12-08

它们都提供大致相同的功能。我应该选择哪一款来开发我的高性能 TCP 服务器?有什么优点和缺点?

参考链接:

阿帕奇米娜 (source)

Netty (source)


虽然 MINA 和 Netty 有着相似的目标,但它们在实践中却有很大不同,您应该仔细考虑您的选择。我们很幸运,因为我们有很多使用 MINA 的经验,并且有时间和 Netty 一起玩。我们特别喜欢更简洁的 API 和更好的文档。纸面上的表现似乎也更好。更重要的是,我们知道 Trustin Lee 会随时回答我们的任何问题,他确实做到了。

我们发现 Netty 一切都变得更容易。时期。当我们试图重新实现 MINA 上已有的相同功能时,我们是从头开始的。通过遵循优秀的文档和示例,我们最终以更少的代码获得了更多的功能。

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

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

但后来我们遇到了障碍。我们已经在 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 进行虚拟重写 - 您不会后悔的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty 与 Apache MINA 的相关文章

  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从

随机推荐

  • NodeJS 应用程序的安全分发

    What NodeJS 应用程序可以作为二进制分发吗 IE 您通过 V8 将 js 应用程序编译为其本机二进制文件 并将该二进制文件分发给客户端吗 如果您可以完全访问 NodeJS 服务器 或者您能做的只是缩小代码 Why 我们在 Node
  • 反应本机材料顶部选项卡导航器滑动禁用取决于屏幕

    只想使地图组件禁用滑动 但在使用 swipeEnabled 时应用整个屏幕 我能怎么做 const Tab createMaterialTopTabNavigator const Tabs gt return
  • 有序列表
      ,以 XHTML Strict 开始索引?

    有没有办法在遵循 XHTML Strict 的同时从特定索引开始有序列表 使用 start n 效果很好 但已经已弃用 预期目的是通过分页恢复索引 我看到了一些对 CSS 解决方案的引用 但是起始索引不能像已弃用的 start 情况中的属性
  • 如何在我们自己的 perl 脚本中导入多个自定义模块?

    我说过 100 个自定义包 例如 file1 pm file2 pm file3 pm file4 pm file5 pm file6 pm 每个文件包含一个函数 我想将所有内容导入到我的每个简单的 Perl 脚本中 如何以简单的方式导入它
  • 关于 C++ 中自定义对象的构造函数/析构函数和 new/delete 运算符

    假设我有一个自己创建的链表 它有自己的析构函数 可以释放内存 这个链表不会重载new或delete 现在 我正在尝试创建一个所述链表的数组 开放散列 如果我理解正确的话 然后我在这个开放哈希类的构造函数中分配必要的内存 在构造函数内部调用的
  • 减少 ggplot2 中条形图组之间的空间

    我无法删除 geom plot 中条形组两侧的额外空白 我想做罗兰在这里取得的成就 删除条形图之间的空间ggplot2但是当我尝试实施他的解决方案时 我收到错误 警告消息 geom bar 不再有binwidth范围 请用geom hist
  • 编译器错误 CS0019:比较两个整数

    在 C 中 为什么第一个 if 语句会给出编译错误 而第二个则不会 有人可以解释一下吗 1 if num 1 1 Console WriteLine Test 这给了我 错误CS0019运算符 不能应用于 int 和 bool 类型的操作数
  • 使用 Achartengine 可以实现多个堆叠条形图吗?

    我尝试将另一组值添加到演示示例中使用 achartengine 堆积条形图 但是我引入的新值没有出现在图表上 堆叠条是否仅限于两个条 public Intent getIntent Context context String titles
  • 用于在 Int、Double 和 Integer 类型实例之间进行选择的 Haskell 规则

    我想知道在 GHCi 中评估表达式时 Haskell 使用什么规则来始终决定 Integer 实例而不是其他实例1 2 import Debug Trace class MyFuns a where a a a instance MyFun
  • 静态函数调用之前的泛型尖括号[重复]

    这个问题在这里已经有答案了 我一直使用泛型并且总是看到像这样使用尖括号 Class
  • 从 App.OnStartup 调用异步 Web API 方法

    我将 App OnStartup 更改为异步 以便我可以在 Web api 上调用异步方法 但现在我的应用程序不显示其窗口 我在这里做错了什么 protected override async void OnStartup StartupE
  • ProcessBuilder 无法运行带参数的 python 脚本

    好的 我有一个通过 ProcessBuilder 运行的 python 脚本 一切正常 我遇到的问题是每当我将参数传递给 python 脚本时 python 脚本都会以unrecognized argumets 但如果我采取确切的命令并将其
  • 运行 Jar 应用程序时 Java Web Start NumberFormatException

    在尝试使用 JWS JNLP 启动来运行 Jar 应用程序时 它一直给我这个错误 甚至找不到错误在哪里 任何指示都会有所帮助 如果有人可以告诉我这个错误的潜在位置在哪里 我可以在这里找到该代码 java lang NumberFormatE
  • 更改窗口标题中的光标

    我有一个 WinForm 现在我需要在光标位于窗口标题部分时更改光标 我有一些代码正在运行 它有两个问题 当光标位于边缘时 它还会更改光标 应显示正常的调整大小光标 我发现我需要这样的东西WM NCHITTEST HTTOP 但是我该如何结
  • 在Java中,如何判断线程是否正在运行?

    如何判断一个线程是否正在运行 Thread isAlive
  • 将文件放在 HDFS 上,名称中包含空格

    我有一个名为file name 1 zip 里面有空格和括号 我想把这个文件放在HDFS上 但每次我尝试把它通过hadoop fs put 我得到一个例外 我什至尝试在文件周围添加引号 甚至尝试转义空格和括号 但它不起作用 hduser l
  • 如何将一个 ArrayList 的内容复制到另一个 ArrayList 中?

    我有一些数据结构 我想使用一个作为临时数据结构 另一个作为非临时数据结构 ArrayList myObject new ArrayList ArrayList myTempObject new ArrayList fill myTempOb
  • Firefox 中的 Firefox 5 调度事件

    我有一些使用的代码dispatchEvent模拟点击 同样的代码在 Chrome 中运行良好 但在 Firefox 中不起作用 这是代码 var evt document createEvent MouseEvents evt initEv
  • 在 Linux 上连接两个文件

    我有两个文件 我想加入他们 cat t1 1 1 2 2 2 2 cat t2 1 2 1 我想要下面的输出 cat joind txt 1 1 2 2 2 2 1 1 2 但是当我使用join命令 第三行不会出现在输出中 一个简单的awk
  • Netty 与 Apache MINA

    它们都提供大致相同的功能 我应该选择哪一款来开发我的高性能 TCP 服务器 有什么优点和缺点 参考链接 阿帕奇米娜 source Netty source 虽然 MINA 和 Netty 有着相似的目标 但它们在实践中却有很大不同 您应该仔