我有 6 个容器在 docker swarm 中运行。 Kafka+Zookeeper、MongoDB、A、B、C 和接口(interface)。接口(interface)是公共(public)的主要访问点——只有这个容器发布端口——5683。接口(interface)容器在启动期间连接到A、B和C。我正在使用 docker-compose file + docker stack deploy,每个服务都有一个名称,用作接口(interface)的主机。一切都成功启动并且工作正常。一段时间后(20 分钟,1 小时,..)我无法请求接口(interface)。接口(interface)收到我的请求,但应用程序失去了与服务 A、B、C 或所有这些的连接。如果我重新启动界面,它能够重新连接到服务 A、B、C。
我首先认为这是应用程序的问题,所以我在每个服务(接口(interface)、A、B、C)上公开了 2 个新端口,并与探查器和调试器连接到它们。应用程序运行正常,没有泄漏,没有阻塞线程,正常工作并等待连接。调试器告诉我,当我向接口(interface)发出请求并且接口(interface)尝试请求服务 A 时,抛出了由对等异常重置的连接。
在调试过程中,我发现了一些有趣的东西。当服务启动时,我将调试器连接到接口(interface),并且调试器在一段时间后断开连接。 + 在我向容器 -> 应用程序发出请求之前,我无法重新连接它。问题 - 握手失败。
我发现的另一个有趣的事情是我无法请求这两个接口(interface)。所以我用wireshark 看看发生了什么,然后:SYN - ACK 很好。然后应用程序发布一些数据和接口(interface)响应 FIN,ACK。我假设当接口(interface)尝试请求服务 A 并且它 FIN 连接时也会发生这种情况。接口(interface)、A、B、C的代码库对于netty server是一样的。
最后,我认为这不是应用程序问题。为什么?我试图不将容器部署为服务。我分别运行每个容器,发布每个容器的端口,并将服务端点设置为 localhost。 (不是覆盖网络)。它正在工作。容器运行没有问题。 + 我一开始并没有说 java 应用程序(接口(interface)、A、B、C)在作为独立应用程序运行时运行没有问题 - 而不是在 docker 中。
你能帮我看看可能是什么问题吗?为什么在覆盖网络的情况下docker正在关闭套接字?
我正在使用最新的 docker。我也用过旧的。
最佳答案
最后,我能够解决问题。
发生了什么,再来一次。接口(interface)打开到 A、B、C 的永久 TCP 连接。当您尝试将这些服务 A、B、C 作为独立的 Java 应用程序运行时,一切正常。当我们将它们 dockerize 并在 swarm 中运行时,它只工作了几分钟。奇怪的是,当你从客户端向接口(interface)发出请求时,接口(interface)和另一个服务之间的连接就中断了。
经过多次不成功的测试和调试每个容器后,我尝试分别运行每个 docker 容器,使用映射的端口并指定 localhost 作为端点。 (每个容器暴露的端口和接口(interface)都连接到本地主机)有趣的事情发生了,它正在工作。当您像这样运行容器时,会使用不同的容器网络驱动程序。一号桥。如果在 swarm 中运行,则使用覆盖网络驱动程序。
所以它必须与 docker 网络有关,而不是与应用程序本身有关。下一步是在几分钟后从每个容器进行 tcpdump,此时它应该停止工作。非常有趣。
几分钟后没有通信,A 正在重置打开的 TCP 通信。为什么?
Docker 使用 IP 虚拟服务器,而 IPVS 维护自己的连接表。 IPVS 表中 CLOSE_WAIT 连接的默认超时为 60 秒。因此,当服务器在 60 秒后发送某些内容时,IPVS 连接不再可用,并且数据包对于新的 TCP session 看起来无效并获得 RST。在客户端,连接永远保持在 FIN_WAIT2 状态,因为应用程序仍然打开了套接字;内核的 fin_wait 计时器仅对孤立的 TCP 套接字起作用。
这是我读到的关于它的内容以及如何理解它。我不确定我对问题的解释是否正确,但基于这些假设,我在接口(interface)和 A、B、C 服务之间实现了 ping-pong,以防 60 秒内没有通信。而且,它正在工作。
关于Docker 服务在一段时间后停止通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43311004/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除