插座可靠吗?

时间:2009-07-21 07:01:26

标签: sockets communication reliability qos

使用套接字在两台服务器之间发送数据是一个好主意,还是应该使用MQ之类的东西来移动数据。

我的问题:如果我只需要/确保提供数据,那么套接字是否可靠?

还有其他解决方案吗?

感谢。

8 个答案:

答案 0 :(得分:14)

套接字是用于执行网络通信的应用程序级API。套接字的可靠性取决于您在创建套接字时选择的网络协议。如果选择TCP / IP,您将获得“可靠”传输......达到限制。如果选择UDP / IP,您将获得“不可靠”的传输。

如其他答案中所述,TCP可确保您不会丢失或损坏数据:

  1. 如果有足够长的网络 停电,或发送者或接收者 死掉TCP / IP连接会中断 除非你,否则你将失去数据 采取措施重新启动 连接。
  2. 如果有网络     级别数据损坏,有一个     很小的概率,它不会     由校验和检测。
  3. 对于比TCP / IP提供的更高级别的可靠性保证,您需要在应用程序的基于Socket的网络层顶部实现更灵敏的校验和和保证的传递机制。或者使用消息排队产品,为您做好工作。

    因此,您的问题的答案取决于您使用套接字的方式,以及系统所需的可靠性级别。

答案 1 :(得分:2)

套接字与您的实现一样可靠,并且基于底层硬件。如果你不想要做出有保证的送货服务的麻烦(在什么条件下?100%永远不会发生),消息队列系统是一个不错的选择。消息队列将实现所有持久性,排队,重试等,如果您使用标准套接字,则需要自己实现。

答案 2 :(得分:2)

如果您需要保证交付,无论发生什么情况(例如,如果另一方离线进行维护)并且您不想自己编写所有逻辑,则应该使用MQ。套接字是用于连接到另一方的套接字,无论该方是MQ还是消息的最终接收方。

答案 3 :(得分:2)

套接字是可靠的,因为每个通信都在它之上完成,包括MQ。

但您可能希望在MQ中添加一些有保证的交付,以提高应用程序的可靠性。它是什么?保证交付可确保您的消息至少被消费者处理一次,且不超过一次。 消费者是关闭?制片人关了吗? MQ服务器已关闭?磁盘崩溃了?感谢MQ,没有任何消息会丢失,无论发生什么(只要你的管理员知道他的工作)。 除此之外,如果重新启动使用者,则不会处理任何消息两次。如果消息包含数百万美元的转账,那么这可能很重要。 但它并不保证您的邮件会在一段时间内得到处理。根据您的申请,处理时间对于保证交付而言更为重要。

您可以根据自己的需要选择最佳的服务器通信方式。保证交付交付具有财务和性能成本,因此仅在需要时才使用(例如,数百万美元的转移)。

对于大多数应用程序,只有在失败时重试邮件才能实现令人满意的功能。但这不是真正的一次性保证交付。不要试图自己实现它,这是一个非常困难的东西,只有少数人能够实现。考虑重新开发像MQ或Apache AQ这样复杂的软件是有用的。

希望有所帮助。

  • 杰布

答案 4 :(得分:1)

套接字是传输数据的原始机制。其他一切都在此基础上实施。在OSI network model中,它们属于第4层。虽然它们实现了可靠的端到端连接,但它们很少用作最终协议。您几乎总是需要实现应用程序层。这将取决于您的应用程序(您需要传输文件或只是发送消息)和您的网络基础设施。

答案 5 :(得分:0)

如果您使用stream socket,TCP协议可确保数据在传输过程中不会丢失,并且不太可能被破坏(尽管您必须确定其16位校验和是否足够,或者您需要应用层校验和机制)。

MQ系统提供什么,以及您可能需要或不需要的是应用级transaction-type可靠性,即即使面对间歇性硬件或软件故障也能保证交付。

答案 6 :(得分:0)

根据数据类型,简单的Web服务可能是最快的解决方案。它们相对容易设置和测试。虽然对于某些特定的例子,我需要知道你正在运行什么样的数据和环境。

答案 7 :(得分:0)

这取决于您正在开发的应用程序类型。你正在编写一个程序,你需要响应或发送消息的确认,然后TCP套接字是好的。但是,如果要实现某种工作流类型的方案,则应使用消息队列。