是插座可靠吗?(Are sockets reliable?)

2019-06-26 11:02发布

它是一个好主意,使用套接字在两个服务器之间发送数据,或者我应该使用类似MQ移动数据。

我的问题:是插座可靠的,如果我需要的数据只有一次/有保证的交付?

是否有任何其他解决办法?

谢谢。

Answer 1:

套接字是用于执行网络通信的应用级API。 插座的可靠性取决于在创建插座您选择的网络协议。 如果您选择TCP / IP,你会得到“可靠”转移......到一个极限。 如果选择UDP / IP,你会得到“不可靠”转移。

在其他的答案说,TCP确保不会丢失或损坏的数据在一定程度上:

  1. 如果有一个足够长的网络中断,或者发送者或接收者死一个TCP / IP连接将打破,除非你采取措施,重新启动连接数据就会丢失。
  2. 如果有一个网络层的数据损坏,有一个小的概率将不会被校验和检测。

对于更高级别的可靠性保证比TCP的/ IP规定,你需要在你的应用程序的基于Socket的网络层的顶部来实现更灵敏和校验保证交付机制。 或使用消息队列的产品,做艰苦的工作适合你。

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



Answer 2:

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



Answer 3:

你或许应该使用MQ,如果你需要保证交付不管发生什么(例如,如果对方下线维护),你不想自己写所有的逻辑。 套接字是你用什么来连接到对方,不管该当事方是MQ或消息的最终接收者。



Answer 4:

因为每一个通信在它的上面,包括MQ做插座可靠。

但是你可能想添加一些保证下,交付与MQ,以提高应用程序的可靠性。 它是什么? 交货保证下可确保您的消息被处理至少一次,不超过一次,深受消费者。 消费者了吗? 制片人了吗? 在MQ服务器关闭? 磁盘崩溃? 由于MQ,没有信息会丢失,不论发生什么(前提是您的管理员知道他的工作)。 除此之外,如果你重新启动消费,没有消息会被处理两次。 至极可能是重要的,如果消息包含百万美元转让。 不过,这并不garantee你的消息在时间raisonnable量处理。 和处理时间是一段更重要的是保证下,交付,这取决于你的应用程序。

它是由你来选择根据您的需要你的服务器之间进行通信的最佳方式。 交货保证下交付兼具金融和性能代价,所以,如果真的需要(例如数百万美元tranfers)仅被使用。

对于大多数应用,可以实现只通过重试邮件满意的东西时,则失败。 但是,这是没有真正的一次性的保证下,交付。 不要试图自己来实现它,这是一个非常困难的东西,只有少数能够实现。 这是useles考虑redevelopping软件那样复杂MQ或Apache AQ。

希望帮助。

  • 杰布


Answer 5:

套接字是用于传输数据的原始机制。 其它所有东西都在此之上实现的。 在OSI网络模型它们属于层4.虽然它们实现可靠的终端对终端的连接,它们很少使用作为结束协议。 你几乎总是需要实现的应用层。 什么这将是取决于你的应用程序(你需要传输文件或只发送消息)和网络基础设施。



Answer 6:

如果使用的是流套接字 ,TCP协议确保数据不会丢失传输,也不可能会损坏(但你必须决定它的16位校验和是否足够,或者您需要一个应用层的校验机制)。

什么MQ系统提供,并且你可能会或可能不会需要的是应用级的事务类型的可靠性,即保证即使在间歇的硬件或软件故障时的输送能力。



Answer 7:

根据数据的类型,一个简单的Web服务可能是最快的解决方案。 他们比较容易建立和测试。 虽然对一些具体的例子我需要知道你正在运行什么样的数据和环境。



Answer 8:

它大量迁入取决于应用程序的您正在开发的类型。 它你写,你需要再发送TCP套接字是好消息的响应或ACK的程序。 但是,如果你正在实施一些工作流程那种情景,你应该使用消息队列。



文章来源: Are sockets reliable?