2013-06-24 2 views
2

Id'like для разработки веб-сервисов + сервер веб-сокетов с использованием дротика, но проблема в том, что я не могу обеспечить высокую доступность сервера из-за неиспользуемых исключений в изолятах.Dart Web Server: предотвращение сбоя

Конечно, я попробовал свою основную функцию, но этого недостаточно.

Если в части then() будущего произойдет сбоя, произойдет сбой сервера.

Это означает, что ОДИН БЫСТРЫЙ запрос может опустить сервер.

Я понимаю, что это open issue, но есть ли какой-либо способ для acknoledge любого сбоя БЕЗ сбоя виртуальной машины, чтобы сервер мог продолжать обслуживать другие запросы?

спасибо.

ответ

3

То, что я делал в прошлом, это использование основного изолята для запуска изолированного ребенка, в котором размещается фактический веб-сервер. Когда вы запускаете изолировать, вы можете передать обработчик «неперехваченного исключения» для изолирования ребенка (я также думаю, что вы также сможете зарегистрировать его на верхнем уровне, чтобы предотвратить эту конкретную проблему, на что ссылается проблема в исходном вопросе).

Пример:

import 'dart:isolate'; 

void main() { 
    // Spawn a child isolate 
    spawnFunction(isolateMain, uncaughtExceptionHandler); 
} 

void isolateMain() { 
    // this is the "real" entry point of your app 
    // setup http servers and listen etc... 
} 

bool uncaughtExceptionHandler(ex) { 
    // TODO: add logging! 
    // respawn a new child isolate. 
    spawnFunction(isolateMain, uncaughtException); 
    return true; // we've handled the uncaught exception 
} 
+0

Это было бы здорово, если бы у меня не было uncatchExceptionHandler, но как-то я не могу. [Я разместил новый вопрос для этого] (http://stackoverflow.com/questions/17292762/dart-unhandledexceptioncallback-is-ignored). –

+0

Спасибо - увидели ваш вопрос и подняли сообщение об ошибке: http://dartbug.com/11505 –

3

Крис Buckett дал вам хороший способ, чтобы перезагрузить сервер, когда он выходит из строя. Однако вы все равно не хотите, чтобы ваш сервер опустился.

try-catch работает только для синхронного кода.

doSomething() { 
    try { 
    someSynchronousFunc(); 

    someAsyncFunc().then(() => print('foo')); 
    } catch (e) { 
    // ... 
    } 
} 

Когда метод асинхронной завершается или выходит из строя, это происходит «длинный» после того как программа выполняется с помощью метода doSomething.

Когда вы пишете асинхронный код, это вообще хорошая идея, чтобы начать метод, возвращая будущее:

Future doSomething() { 
    return new Future(() { 
    // your code here. 
    var a = b + 5; // throws and is caught. 

    return someAsyncCall(); // Errors are forwarded if you return the Future directly. 
    }); 
} 

Это гарантирует, что если у вас есть код, который бросает, ловит их, и вызывающий абонент может затем catchError() их.

Если вы напишете этот путь, у вас будет гораздо меньше сбоев, если вы по крайней мере ошиблись на верхнем уровне.

Всякий раз, когда вы вызываете метод, возвращающий будущее, либо возвращайте его прямо (как показано выше), либо catchError(), чтобы вы могли локально обрабатывать возможные ошибки.

На домашней странице a great lengthy article, которую вы должны прочитать.