MS Syncframework 4 - 服务器端处理 5 分钟后无响应
MS Syncframework 4 - no response after 5 minutes of server side processing
背景:
我们已经在旧生产服务器上使用 MS SyncFrameWork 4 在多个 MS SQL 数据库和 android 设备之间设置了同步。
初始同步总是花费最长的时间,但该时间不是问题,因为它只在第一次使用设备时发生。
服务器详细信息:
- OS: Windows 网络服务器 2008 R2
- 数据库:SQL Server 2008 R2
- IIS: 7.5
- 同步框架 4
问题:
如果服务器上的数据库很大 - 初始同步在服务器端处理需要超过 5 分钟 - android 客户端似乎没有从服务器获得响应并运行超时。
根据服务器的负载,服务器端的初始同步过程需要 3 到 10 分钟。
如果初始同步成功,之后就没有问题了。
检查日志和跟踪时,我们没有发现任何错误。 IIS 工作进程似乎完成任务没有错误,即使它需要超过 5 分钟。
但是如果
public Message ProcessRequestForMessage(Stream messageBody)
in class Microsoft.Synchronization.Services.SyncService 需要超过 5 分钟才能完成,android 客户端没有得到响应。即使它在指定的 900 秒套接字超时内。
在 Android 设备上发生 IOException:java.net.SocketTimeoutException:900 秒后读取超时 异常。
Android 端用于初始化 httpClient 的代码:
HttpParams httpParameters = new BasicHttpParams();
int timeout = 900 * 1000;
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, timeout);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);
以后使用:
HttpResponse response = httpclient.execute(request);
我们尝试了什么:
- 增加 Android 端的套接字超时值
- 增加 IIS 应用程序池工作进程超时(尽管从未达到 20 分钟的默认值)
- 在 Web.config 中将 ExecutionTimeout 增加到 600 甚至更多 - 摘自 IIS Request Timeout on long ASP.NET operation
- 增加 Web.config 中的绑定超时:openTimeout="00:15:00" closeTimeout="00:15:00" sendTimeout="00:15:00" receiveTimeout=" 00:15:00
所以我的问题是:
- 是否有任何其他 IIS 进程超时设置可以在点击时静默阻止发送响应?我们可以在哪里设置它们?
- androids httpclient 在闲置 5 分钟后静默停止工作是否存在已知问题?
- 任何其他想法可能会干扰什么或我们可以在哪里调整我们的代码?
为清楚起见编辑:
- 我们使用批处理(文件大小 1000 kb)
- 我们将默认批处理文件夹从 C:\Windows\Temp 更改为 C:\andsync\batchdir尽可能
- 当 android 设备在 Nexus 6p (Android 8) 和 Nexus 9 (Android 7.1.1) 上没有进入待机状态时也会出现问题,所以我认为我们可以解除 Selvin
提到的打瞌睡/待机 Android 功能
- 在 SyncScope 中只有一个 table 包含一列类型 'image'。这个 table 的大小总是在增加,并且在大约 30.000 个条目(累积到大约 2.2 GB 大小)时它开始显示所描述的行为。
我的问题的答案:
客户端和服务端的代码都可以。 罪魁祸首是 NAT 'TCP-Aging'-我们 LANCOM 路由器中的设置。 https://www.lancom-systems.com/docs/LCOS/menu-reference/topics/2_8_9_1.html
配置为 300 秒 => 5 分钟 ...
于是我们的路由器在闲置5分钟后悄悄断了连接...
我知道让一个空闲连接保持活动这么久不是最佳做法,但由于在我们的用例中这种情况很少发生,所以对我们来说没问题。
这个 post 的答案让我走上正轨:
背景:
我们已经在旧生产服务器上使用 MS SyncFrameWork 4 在多个 MS SQL 数据库和 android 设备之间设置了同步。 初始同步总是花费最长的时间,但该时间不是问题,因为它只在第一次使用设备时发生。
服务器详细信息:
- OS: Windows 网络服务器 2008 R2
- 数据库:SQL Server 2008 R2
- IIS: 7.5
- 同步框架 4
问题:
如果服务器上的数据库很大 - 初始同步在服务器端处理需要超过 5 分钟 - android 客户端似乎没有从服务器获得响应并运行超时。
根据服务器的负载,服务器端的初始同步过程需要 3 到 10 分钟。 如果初始同步成功,之后就没有问题了。
检查日志和跟踪时,我们没有发现任何错误。 IIS 工作进程似乎完成任务没有错误,即使它需要超过 5 分钟。 但是如果
public Message ProcessRequestForMessage(Stream messageBody)
in class Microsoft.Synchronization.Services.SyncService 需要超过 5 分钟才能完成,android 客户端没有得到响应。即使它在指定的 900 秒套接字超时内。
在 Android 设备上发生 IOException:java.net.SocketTimeoutException:900 秒后读取超时 异常。
Android 端用于初始化 httpClient 的代码:
HttpParams httpParameters = new BasicHttpParams();
int timeout = 900 * 1000;
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, timeout);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);
以后使用:
HttpResponse response = httpclient.execute(request);
我们尝试了什么:
- 增加 Android 端的套接字超时值
- 增加 IIS 应用程序池工作进程超时(尽管从未达到 20 分钟的默认值)
- 在 Web.config 中将 ExecutionTimeout 增加到 600 甚至更多 - 摘自 IIS Request Timeout on long ASP.NET operation
- 增加 Web.config 中的绑定超时:openTimeout="00:15:00" closeTimeout="00:15:00" sendTimeout="00:15:00" receiveTimeout=" 00:15:00
所以我的问题是:
- 是否有任何其他 IIS 进程超时设置可以在点击时静默阻止发送响应?我们可以在哪里设置它们?
- androids httpclient 在闲置 5 分钟后静默停止工作是否存在已知问题?
- 任何其他想法可能会干扰什么或我们可以在哪里调整我们的代码?
为清楚起见编辑:
- 我们使用批处理(文件大小 1000 kb)
- 我们将默认批处理文件夹从 C:\Windows\Temp 更改为 C:\andsync\batchdir尽可能
- 当 android 设备在 Nexus 6p (Android 8) 和 Nexus 9 (Android 7.1.1) 上没有进入待机状态时也会出现问题,所以我认为我们可以解除 Selvin 提到的打瞌睡/待机 Android 功能
- 在 SyncScope 中只有一个 table 包含一列类型 'image'。这个 table 的大小总是在增加,并且在大约 30.000 个条目(累积到大约 2.2 GB 大小)时它开始显示所描述的行为。
我的问题的答案:
客户端和服务端的代码都可以。 罪魁祸首是 NAT 'TCP-Aging'-我们 LANCOM 路由器中的设置。 https://www.lancom-systems.com/docs/LCOS/menu-reference/topics/2_8_9_1.html
配置为 300 秒 => 5 分钟 ... 于是我们的路由器在闲置5分钟后悄悄断了连接...
我知道让一个空闲连接保持活动这么久不是最佳做法,但由于在我们的用例中这种情况很少发生,所以对我们来说没问题。
这个 post 的答案让我走上正轨: