Тема: Node.JS + MongoDB
Показать сообщение отдельно
Старый 05.09.2013, 13:57   #17
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Node.JS + MongoDB

Сообщение от pax Посмотреть сообщение
А ты для задержки всегда setTimeout используешь? Я сейчас пользуюсь setImmediate для создания асинхронности. Она вроде откладывает выполнение до следующего цикла.
Ну если тебе нужно выполнить как можно скорее, но ты хочешь немного распределить нагрузку, то конечно можно.
Но имхо, если у тебя операция на столь тяжёлая и уже потребовала слишком много времени, тогда я советую пересмотреть либо операцию, либо выдвинуть её в отдельный node процесс и общаться с ним через ZeroMQ, тем самым - это будет точно асинхронно (главный процесс не будет выполнять задачу, и сможет паралельно заниматься своими вещами).

Сообщение от pax Посмотреть сообщение
И еще вопрос: как правильно запускать/останавливать/перезапускать node js на сервере? Я пока только на windows его запускал.
Я делал и на win и на unix.
На win, при разработки в Sublime Text 2, есть аддон для настроек компиляции. Тупо - билдишь, и в консоль будет выдаваться консоль. Но нужно дополнительно скрипт для остановки процесса (а то если ты сокет биндишь и не остановишь прошлый процесс, новый не сможет сокет создать на том же порту).
А для деплоймента использовал NSSM ( http://nssm.cc/ ) - Non-Sucking Service Manager - очень понравился. В win редко когда есть хорошие туулзы и минималистичные как в unix. В общем он создаёт сервис в системе, и следит за ним. Можно настроить разные сценарии если процесс сервиса падает - перезапускать например сразу.
Не для всех конечно случаев, но для многих я тупо сделал сервис на текущий разрабатываемый проект, и всё что нужно было, это останавливать процесс, и сервис перезапускал его автоматически так что заместо - остановить > запустить, я только один клик остановки - и уже мог идти тестировать.
Единственное что логи нужно тогда придумать как слать, для этого я winston сделал и отдельный монитор с дашбоардом консоля

На linux, есть два способа, первый проще и быстрее - screen. Делаешь отдельный screen и запускаешь там, затем детачишься из скрина если не нужно там быть.
Но лучше конечно написать скрипт для сервиса, плюсов много - логи можно в файл по стандарту выводить. Автозапуск при рестарте компа. Удобно рестартовать: service api restart

Вот файл для скрипта, кладём в /etc/init.d/ я назвал его "api". Работает на RedHat системах и Ubuntu. Естественно замени пути к твоим файлам сам.
service api start
service api stop
service api restart
Логи по стандарту тут: /var/log/api.log

#!/bin/sh

#
# chkconfig: 35 99 99
# name: API
# description: Node.js /var/api/app.js
#

if [ -"/etc/rc.d/init.d/functions" ] ; then
  
. /etc/rc.d/init.d/functions
  USER
="ec2-user"
  
ROOT_DIR="/var/api"
  
LOCK_FILE="/var/lock/subsys/api"
  
LOG_FILE="/var/log/api.log"
else
  . /
lib/lsb/init-functions
  USER
="root"
  
ROOT_DIR="/vagrant"
  
LOCK_FILE="/var/lock/api"
  
LOG_FILE="/var/log/api.log"

  
echo_success() {
    echo -
"[  OK  ]"
    
return 0
  
}
  
echo_failure() {
    echo -
"[FAILED]"
    
return 1
  
}
fi

DAEMON
="/usr/local/bin/node"
SERVER="$ROOT_DIR/app.js"

start() {
  
pid=`ps -aefw | grep "$DAEMON $SERVER" | grep -v "grep " | awk '{print $2}'`
  if [ -
"$pid] ; then
    
echo "$SERVER is already running."
    
RETVAL=1
  
else
    echo -
"Starting $SERVER: "
    
if [ type runuser > /dev/null 2>&] ; then
      runuser 
-"$USER-"$DAEMON $SERVER >> $LOG_FILE &" && echo_success || echo_failure
    
else
      
su "$USER-"$DAEMON $SERVER >> $LOG_FILE &" && echo_success || echo_failure
    fi
    RETVAL
=$?
    echo
    [ 
$RETVAL -eq 0 ]
  
fi
}

stop() {
  echo -
"Stopping $SERVER: "
  
pid=`ps -aefw | grep "$DAEMON $SERVER" | grep -v "grep " | awk '{print $2}'`
  
kill -9 $pid > /dev/null 2>&&& echo_success || echo_failure
  RETVAL
=$?
  echo
  [ 
$RETVAL -eq 0 ]
}

case 
"$1" in
  start
)
    
start
    
;;
  
stop)
    
stop
    
;;
  
restart)
    
stop
    start
    
;;
  *)
    echo 
"Usage: $0 {start|stop|restart}"
    
RETVAL=1
esac

exit $RETVAL 
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
pax (06.09.2013), SpiritSound (06.12.2015)