2012-04-30 2 views
2

Мне очень понравилось экспериментировать с Метером в последнее время, и до сих пор я нашел его очень аккуратным маленьким приложением. Я решил перенести старое приложение на метеорит и уже сделал хороший прогресс. Приложение представляет собой приложение для обновления итоговых показателей. Хотя мне удалось продемонстрировать концепцию, я обнаружил 2 проблемы, которые могут помешать мне использовать ее.Масштабируемость и производительность в Meteor

1) Данные, ранее существовавшие в базе данных mySQL, поэтому я написал сценарий для экспорта данных в .js-файлы. Для тех, кто может захотеть сделать подобное, основная часть кода PHP находится здесь.

$handle = fopen($output_file, "w"); 

foreach ($tables as $key => $table) { 
     $query = "SELECT * FROM $table_prefix$table"; 
     $res = mysql_query($query); 
     while ($row = mysql_fetch_assoc($res)) { 

       $newTableName = ""; 

       $parts = explode("_", $table); 
       foreach ($parts as $k => $v) { 
         $newTableName .= ucfirst($v); 
       } 

       $string = $newTableName.".insert({"; 
       $first = true; 
       foreach ($row as $columnName => $value) { 
         if (!$first) { $string .= ", "; } 
         $string .= "$columnName : \"$value\""; 
         $first = false; 
       } 
       $string .= " });"; 
       print $string . "<br>"; 

     } 
} 

Хотя это работало для большинства таблиц, у меня есть одна таблица, в частности содержащая всю информацию о событии. Этот отдельный .js-файл содержит 3600 строк операторов вставки, и казалось бы, когда это приложение, приложение прерывается. Если я переименую файл, например, «event.js.save», то приложение будет в порядке. Более конкретно, этот .js файл на месте, когда я развернуть приложение я получаю ..

mac:app user$ meteor deploy <domain>.meteor.com 
Deploying to <domain>.meteor.com. Bundling ... 

Errors prevented deploying: 
Exception while bundling application: 
RangeError: Maximum call stack size exceeded 

Итак, вопрос номер 1 - как много было сделано, чтобы проверить масштабируемость этого Appliction?

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

Когда я загружаю страницу в Safari, анимация «progress» в правом верхнем углу постоянно вращается, и из того, что я видел, 5% батареи проходит, вероятно, 10 минут.

Вопрос номер 2 - как поддерживается соединение браузерами? Есть ли что-то, что можно сделать для снижения воздействия на мобильные браузеры?

Спасибо.

ответ

2

1: Приложения очень масштабируемы в случае, если сайт метеоритов управлял запуском только штрафом с огромным количеством трафика всего за один день, когда они не планировали его. Причина вашей ошибки заключается в том, что вы не можете назвать столько операторов, которые одинаковы в строке, насколько мне известно, поскольку js думает, что это сбой. Я думаю, что есть способы изменить это, или обойти его.

Что касается тестирования, которое они сделали, я не уверен, лично я бы импортировал данные, перебирая данные и вставляя их, вместо того, чтобы иметь это как много вызовов (я думаю, что это проблема).

2: Это ошибка, когда она вращается, но она постоянно проверяет аякс или подобные методы. В будущем будут использоваться сокеты, которые, я ожидаю, будут более эффективными. Возможно, будет возможность настроить количество запросов и интенсивность сети в будущем.

+0

Вращение фактически работает так же, как и в браузере. Это вызвано AJAX: AJAX означает, что что-то загружается, если что-то загружает колеса вращений:) –

+0

Приветствия для резервного копирования ниже :), да, не знаю, я хочу, чтобы вращающееся колесо, когда AJAX загружается лично. – jonathanKingston

+0

Благодарим за обновление. Я смог решить ситуацию сейчас, слегка изменив свой код, как вы предложили. Я отправил ответ ниже с обновленным кодом и комментариями к №2. Благодарю. – afeltham

-7

jonathanKingston сказал

1: Приложения очень масштабируемые в том случае, когда сайт метеора управлял запуском просто отлично с огромным количеством трафика все в один день, когда они не планировал для него ,

Это весело, потому что домашняя страница для Метеор не является приложением Meteor, и им пришлось снимать все демонстрационные приложения Meteor в автономном режиме из-за соображений безопасности/масштабируемости.

С нетерпением ждем следующего поколения FUD, распространяемого глупыми программистами, которым доверяют красивые демонстрации и сообщения Hacker News.

+1

Если вы потратили время, чтобы посмотреть исходный код Meteor.com, вы увидите, что он работает на метеоре. –

+0

Я думаю, что во время запуска Meteor был, и вы заметите, что Meteor.com не использует по крайней мере, ветвь версии метеорита, поскольку она визуализирует HTML. Метеор небезопасен, и приложение docs по-прежнему является приложением, каким оно всегда было :). – jonathanKingston

0

Предоставление обновленного исходного кода к данному вопросу:

Как говорилось в одном из ответов, проблема, казалось, число вставленных строк и что Javascript ломать не Meteor. С тех пор я обновил код и подумал, что другим может быть интересно.

Следующая PHP обеспечивает вывод JSON для таблицы ...

// we connect to example.com and port 3307 
$link = mysql_connect('localhost', 'username', 'password'); 
if (!$link) { 
    die('Could not connect: ' . mysql_error()); 
} 
$db = mysql_select_db("databasename"); 
$tables = array (
     $_REQUEST["table"] 
     ); 
$table_prefix = "tableprefix_"; 
header('Cache-Control: no-cache, must-revalidate'); 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Content-type: application/json'); 
foreach ($tables as $key => $table) { 
     $query = "SELECT * FROM $table_prefix$table"; 
     $res = mysql_query($query); 
     $first = true; 
     print "["; 
     while ($row = mysql_fetch_assoc($res)) { 
       if (!$first) { print ", "; } 
       $first = false; 
       print (json_encode($row) . "\n"); 
     } 
     print "]"; 
} 
mysql_close($link); 

можно затем использовать следующее в JavaScript, чтобы загрузить данные.

Events = new Meteor.Collection("event"); 

if (Meteor.is_server) { 
    Meteor.startup(function() { 
    if (Events.find().count() === 0) { 
     $.getJSON('/ajax/event.json', function(data) { 
       $.each(data, function(key, val) { 
         Events.insert(val); 
       }); 
     }); 
    } 
    }); 
} 
+0

Я бы настоятельно рекомендовал вам создать файл архива на стороне сервера и запустить миграцию при запуске, если ваша коллекция не существует, и подумайте над добавлением индекса в свои данные, а не с помощью ajax. Это значительно ускоряет работу. – Anzel

Смежные вопросы