在tcp“长”连接和“短”连接之间select内部服务【JAVA教程】

!
也想出现在这里? 联系我们
信息

在tcp“长”连接和“短”连接之间select内部服务,第1张

概述在tcp“长”连接和“短”连接之间select内部服务

我有一个应用程序,Web服务器将请求redirect到后端服务器,而后端服务器(linux)将对Web服务器进行复杂的计算和响应。 对于Web服务器和后端服务器之间的TCP套接字连接pipe理,我认为有两个基本策略:

“短”连接:即每个请求一个连接。 这对于套接字pipe理似乎非常简单,并且简化了整个程序结构。 接受之后,我们只是得到一些线程来处理请求,最后closures这个套接字。

“长”连接:也就是说,对于一个tcp连接,可能会有多个请求。 看来这个策略可以更好地利用套接字资源,并带来一些性能改进(我不太确定)。 但似乎这比“短”连接带来了很多复杂性。 例如,由于现在套接字fd可能被multithreading使用,所以必须涉及同步。 还有更多,socket失败进程,消息序列…

这两个策略有什么build议吗?

在本地主机上使用相同的IP和端口创build套接字

多次绑定到同一个端口?

如何在另一个线程的超时时间内唤醒select()

select系统调用在一个/ w应用程序中无限期地挂起。

delphi:通过套接字发送多个string?

更新: @SargeATM的答案提醒我,我应该告诉更多关于后端服务。 每个请求都是上下文无关的。 后端服务可以根据一个请求消息进行计算。 这似乎是。 无状态的。

传输源地址为0.0.0.0的UDP包

Python套接字问题:windows中的socket.MSG_DONTWAIT

使用Perl的高性能套接字服务器

Winsock2 – 如何在客户端使用IOCP

套接字的function

在不考虑我认为严重影响这一决定的后端架构的情况下,我更喜欢使用短连接来实现无状态的“快速”请求/响应类型的流量,以及用于有状态协议(如同步或文件传输)的长连接。

我知道建立一个新的连接(如果它不是本地主机)有一些tcp开销,但从来没有什么我不得不在我的应用程序优化。

好的,因为这很重要,所以我会稍微介绍一下体系结构。 我总是使用线程不是每个请求,但功能。 所以我会有一个在套接字上监听的线程。 另一个线程从所有活动连接中读取数据包,另一个线程执行后端计算,并在需要时将最后一个线程保存到数据库。 这使事情干净简单。 易于测量慢点,维护,并在需要时进行优化。

第三个选项呢… 没有连接!

如果你的工作描述和工作结果都很小,UDP套接字可能是一个好主意。 您拥有更少的资源来管理,因为不需要将请求/响应绑定到文件描述符,这为您将来提供了一些灵活性。 想象一下,你有更多的后端服务,并希望做一些负载平衡 – 一个繁忙的服务可以发送作业到另一个作业提交者的UDP地址。 后者只是等待结果,并不关心你在哪里执行任务。

显然,你必须处理丢失,重复和乱序的数据包,但作为奖励,你不必处理断开的连接。 乱序数据包可能不是什么大问题,如果你可以在一个UDP消息中容纳请求和响应,重复可以由一些工作ID来处理,并丢失数据包…好吧,他们可以简单地重新发送;-)

考虑一下!

那么,你是对的。

持续连接的最大问题是确保应用程序从池中获得“干净”的连接。 没有任何垃圾剩余的数据来自另一个请求。

有很多方法可以解决这个问题,但最后最好关闭()受感染的连接并打开新的连接,而不是试图清理它。

总结

以上是内存溢出为你收集整理的在tcp“长”连接和“短”连接之间select内部服务全部内容,希望文章能够帮你解决在tcp“长”连接和“短”连接之间select内部服务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞139 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容