使用套接字在两台服务器之间发送数据是一个好主意,还是应该使用MQ之类的东西来移动数据。
我的问题:如果我只需要/确保提供数据,那么套接字是否可靠?
还有其他解决方案吗?
感谢。
答案 0 :(得分:14)
套接字是用于执行网络通信的应用程序级API。套接字的可靠性取决于您在创建套接字时选择的网络协议。如果选择TCP / IP,您将获得“可靠”传输......达到限制。如果选择UDP / IP,您将获得“不可靠”的传输。
如其他答案中所述,TCP可确保您不会丢失或损坏数据:
对于比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套接字是好的。但是,如果要实现某种工作流类型的方案,则应使用消息队列。