Сообщение от 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 [ -f "/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 -n "[ OK ]"
return 0
}
echo_failure() {
echo -n "[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 [ -n "$pid" ] ; then
echo "$SERVER is already running."
RETVAL=1
else
echo -n "Starting $SERVER: "
if [ type runuser > /dev/null 2>&1 ] ; then
runuser -l "$USER" -c "$DAEMON $SERVER >> $LOG_FILE &" && echo_success || echo_failure
else
su - "$USER" -c "$DAEMON $SERVER >> $LOG_FILE &" && echo_success || echo_failure
fi
RETVAL=$?
echo
[ $RETVAL -eq 0 ]
fi
}
stop() {
echo -n "Stopping $SERVER: "
pid=`ps -aefw | grep "$DAEMON $SERVER" | grep -v "grep " | awk '{print $2}'`
kill -9 $pid > /dev/null 2>&1 && 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