Метеор - Перенос пользователей на другой сервер реплик, если один сервер выходит из строя

В ответах выше, включая GitHub, были некоторые проблемы для моего сценария, а также кнопка «Назад» или «Прямое изменение URL» из браузера - это перезагрузка контроллера, что мне не понравилось. Наконец я пошел со следующим подходом:

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

.when('/:param1/:param2?/:param3?', {
    templateUrl: 'home.html',
    controller: 'HomeController',
    controllerAs: 'vm',
    noReload: true
})

2. В функции запуска вашего модуля поместите логику, которая проверяет эти маршруты. Это предотвратит перезагрузку, только если noReload - true, а предыдущий маршрут - тот же.

fooRun.$inject = ['$rootScope', '$route', '$routeParams'];

function fooRun($rootScope, $route, $routeParams) {
    $rootScope.$on('$routeChangeStart', function (event, nextRoute, lastRoute) {
        if (lastRoute && nextRoute.noReload 
         && lastRoute.controller === nextRoute.controller) {
            var un = $rootScope.$on('$locationChangeSuccess', function () {
                un();
                // Broadcast routeUpdate if params changed. Also update
                // $routeParams accordingly
                if (!angular.equals($route.current.params, lastRoute.params)) {
                    lastRoute.params = nextRoute.params;
                    angular.copy(lastRoute.params, $routeParams);
                    $rootScope.$broadcast('$routeUpdate', lastRoute);
                }
                // Prevent reload of controller by setting current
                // route to the previous one.
                $route.current = lastRoute;
            });
        }
    });
}

3. Наконец, в контроллере слушайте событие $ routeUpdate, чтобы вы могли делать все, что вам нужно, когда изменяются параметры маршрута.

HomeController.$inject = ['$scope', '$routeParams'];

function HomeController($scope, $routeParams) {
    //(...)

    $scope.$on("$routeUpdate", function handler(route) {
        // Do whatever you need to do with new $routeParams
        // You can also access the route from the parameter passed
        // to the event
    });

    //(...)
}

Имейте в виду, что при таком подходе вы не меняете вещи в контроллер, а затем обновить путь соответственно. Это наоборот. Сначала вы меняете путь, затем слушаете событие $ routeUpdate, чтобы изменить ситуацию в контроллере, когда изменяются параметры маршрута.

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

0
задан StormTrooper 17 January 2019 в 09:12
поделиться

1 ответ

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

Некоторые ресурсы по этому вопросу:

https://github.com/phusion/passenger/wiki/Phusion-Passenger:-Meteor-tutorial

[113 ] https://www.phusionpassenger.com/docs/tutorials/installation/meteor/

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

В обоих случаях: установите ваш mongodb на отдельном сервере . Именно поэтому вам необходимо определить переменную среды MONGO_URL в вашем развертывании Meteor, чтобы процесс вашего приложения был отделен от процесса базы данных.

В такой конфигурации вам не нужно будет «отправлять» данные о сбое на отдельный сервер, что, я думаю, может даже не быть реалистичным подходом в производственной среде.

0
ответ дан Jankapunkt 17 January 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: