【问题标题】:Scalability and performance in MeteorMeteor 的可扩展性和性能
【发布时间】:2012-05-10 05:03:45
【问题描述】:

我最近非常喜欢使用 Meteor 进行实验,到目前为止,我发现它是一个非常简洁的小应用程序。我决定将一个旧应用程序迁移到流星上,并且已经取得了一些不错的进展。该应用程序是实时比分更新应用程序。虽然我已经能够展示这个概念,但我发现了 2 个可能阻止我使用它的问题。

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 是 - 为测试此应用程序的可扩展性做了多少工作?

2) 我遇到的第二个问题是关于移动性能的。我花了很长时间让样式表在所有平台上看起来都很好,并且看到移动设备上的电池电量耗尽的速度真的很失望。

当我在 Safari 中加载页面时,右上角的“进度”动画会不断旋转,据我所知,5% 的电池电量可能会在 10 分钟内耗尽。

问题 2 - 如何使浏览器的连接保持活动状态?有什么办法可以减少对移动浏览器的影响?

谢谢。

【问题讨论】:

    标签: android iphone performance meteor


    【解决方案1】:

    为上述问题提供更新的源代码:

    正如在其中一个答案中所讨论的,问题似乎出在插入行的数量上,并且是 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);
                    });
            });
        }
      });
    }
    

    【讨论】:

    • 我强烈建议您在服务器端创建一个固定文件并在您的集合不存在时运行启动迁移,并考虑在您的数据上添加索引,而不是通过 ajax 进行。它大大加快了速度。
    【解决方案2】:

    乔纳森金斯顿说,

    1:应用程序在流星站点的情况下具有很强的可扩展性 在大量流量的情况下很好地管理了发射 有一天,他们没有计划。

    这很有趣,因为 Meteor 的主页不是 Meteor 应用程序,并且由于安全/可扩展性原因,他们不得不将所有 Meteor 演示应用程序下线。

    期待下一代 FUD 被漂亮的演示和黑客新闻帖子所欺骗的愚蠢程序员传播。

    【讨论】:

    • 如果您花时间查看 Meteor.com 的源代码,您会发现它正在流星上运行..
    • 我认为在发布时,Meteor 是,现在你会注意到 Meteor.com 在渲染 HTML 时没有使用至少 dev 分支版本的流星。 Meteor 不是不安全的,文档应用程序仍然是一个应用程序,因为它一直是:)。
    【解决方案3】:

    1: 应用程序非常具有可扩展性,因为流星站点在一天之内就可以很好地管理发射,而他们没有计划好它的大量流量。 您的错误的原因是,据我所知,您不能连续调用那么多相同的语句,因为 js 认为它​​正在崩溃。我认为有办法改变或绕过它。

    就他们所做的测试而言,我不确定,我个人会通过遍历数据并插入数据来导入数据,而不是像调用那样多次(我认为这是问题所在)。

    2: 这是一个正在旋转的错误,但它会不断检查 ajax 或类似方法。 将来将使用我希望效率更高的套接字。 也许将来会有办法降低查询数量和网络密集型。

    【讨论】:

    • 就浏览器而言,旋转实际上按设计工作。它是由 AJAX 触发的:AJAX 表示正在加载,如果正在加载,轮子会旋转:)
    • 为下面的备份干杯 :),是的,当 AJAX 亲自加载时,我不确定我是否想要一个纺车。
    • 感谢您的更新。我现在可以通过按照您的建议稍微更改我的代码来解决这种情况。我在下面发布了回复,其中包含 #2 上的更新代码和 cmets。谢谢。
    • 关于性能和网络问题,您是否考虑过使用 MQTT (mqtt.org/faq) 等发布/订阅协议发布更新?这意味着您无需轮询更新,而是将它们推送到客户端。
    • afeltham - 我猜你的意思不是直接使用它,而只是一个邮件队列样式的事件推送,对吧? Meteor 最终将使用网络套接字,这将启用这种技术:)。我说旋转图标是一个错误,因为这就是他们没有启用网络套接字的原因,因为它一直导致旋转图标等问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2011-06-05
    • 1970-01-01
    • 2012-05-03
    • 2014-09-13
    相关资源
    最近更新 更多