2009-07-21 76 views
6

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

我的问题:如果我只需要一次/确保数据交付,套接字是否可靠?

还有其他解决方案吗?

谢谢。

+1

...的插座可靠吗? – 2009-07-21 07:30:08

+2

@modosansreves:只要第一个字母和最后一个字母就位,只要拼写的单词清晰可读,那么不正确的语法就不会伤害太多。专注于信息而不是单个单词。 – 2009-07-21 08:28:36

回答

12

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

在其他的答案说,TCP确保不会丢失或损坏的数据到一个点:

  1. ,如果有一个足够长的网络 停运,或发送者或接收者 死一TCP/IP连接将中断 ,除非您的步骤 重新启动 连接,否则将丢失数据。
  2. 如果存在网络 级别数据损坏,则存在由校验和检测到的 小概率。

对于比TCP/IP提供的更高级别的可靠性保证,您需要在应用程序的基于Socket的网络层顶部实现更灵敏的校验和和保证传送机制。或者使用消息排队产品,为您做好工作。

所以你的问题的答案是,它取决于你如何使用套接字,以及你的系统需要什么级别的可靠性。

2

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

2

如果您需要有保证的交付,无论发生什么事情(比如如果另一方为了维护而下线)并且您不想自己编写所有逻辑,那么您应该使用MQ。套接字是您用来连接到另一方的信息,无论该方是MQ还是邮件的最终接收方。

1

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

0

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

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

0

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

0

这取决于您正在开发的应用程序的类型。它正在编写一个程序,您需要对发送的消息进行响应或确认,然后TCP套接字就很好。但是,如果您正在实施某种工作流类型的场景,则应该使用消息队列。

2

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

但是,您可能希望使用MQ添加一些保证的交付以提高应用程序的可靠性。它是什么?保证送达确保消息至少处理一次,不超过一次。 消费者是否关闭?制片人关闭了? MQ服务器关闭了?磁盘崩溃了?感谢MQ,不管发生什么情况,都不会丢失任何消息(前提是管理员知道他的工作)。 除此之外,如果您重新启动使用者,则不会处理两次消息。如果消息包含百万美元的转移,这可能很重要。 但它并不保证你的消息在可处理的时间内被处理。并且处理时间有时候更重要,因为您的应用程序会提供保证的交付。

您可以根据自己的需要选择最佳的服务器通信方式。保证交付交付既有财务成本,也有性能成本,所以只有在真正需要的情况下才能使用(例如以百万美元为单位)。

对于大多数应用程序,只有在失败时重试消息才能获得满意的结果。但这不是真正的只有一次保证的交付。不要试图自己来实现它,这是一件非常困难的事情,只有少数人能够实现。考虑重新开发像MQ或Apache AQ这样复杂的软件是徒劳的。

希望有所帮助。

  • 杰布