首页 > 解决方案 > 在服务器上检测 HTTP 请求失败

问题描述

我正在开发一个 HTTP 服务器,它处理来自客户端的事务请求。他们将通过高度不可靠的无线网络进行通信,因此我担心服务器数据库上数据的一致性。以下是我处理POST请求的方式:

void doPost(request, response)
{
    transaction = newTransaction();
    processBody(request);
    transaction.commit();
}

当我从未收到请求时,没有问题。客户端只是获取timeout error并且不执行任何事务。但是,如果响应在网络上丢失会发生什么?当然,客户端仍然会收到timeout error,但这次事务将在服务器上完成,而客户端并不知道!这是我需要处理的不幸案例。

所以,我的问题是:我如何检测是否已交付响应并回滚事务?

我使用 JavaEE 编写服务器应用程序并将其托管在 Glassfish 上。

标签: httpjakarta-eetransactionsclient-serverdistributed-system

解决方案


好的,我想通了这一点。HTTP/TCP 协议栈没有检测响应丢弃的设施。但是,它可以很好地处理请求丢弃,因此我只需要将 POST 请求从服务器发送到客户端,如下所示:

void doPost(request, response)
{
    transaction = newTransaction();
    try {
        var result = processBody(request);
        sendPOSTToClient(result);
        transaction.commit();
    catch (IOException e) {
        transaction.rollback(); // network partition occured
    }
}

推荐阅读