【问题标题】:Meteor.call calls method >100 times with one button clickMeteor.call 一键调用方法> 100次
【发布时间】:2014-07-24 16:07:53
【问题描述】:

我们的团队有一个生产级 Meteor 应用。在应用程序中,我们有一个发送电子邮件的特定 Meteor 方法。 今天它通过单击“提交”按钮发送了 127 封电子邮件(在大约 20 分钟的过程中)。

我无法发布确切的代码,但基本流程非常简单:

  1. 我们捕获提交事件并通过 Meteor.call 将所有内容发送到服务器
  2. Meteor 方法向服务发送请求以呈现 PDF
  3. Meteor 方法向 SendGrid 发送带有附件和其他电子邮件数据的请求
  4. Meteor 方法返回并触发回调

我们确实没有太多基础来确定确切的问题,并且正在研究,但怀疑部分原因是最终用户的连接超时以及 Meteor 重新发送请求而没有得到任何响应。

我们发现有两个线程与该问题相关:https://groups.google.com/forum/#!topic/meteor-talk/vu5kk3t0Lr4https://github.com/meteor/meteor/issues/1285

两者都回答方法应该是幂等的。显然,直接从方法发送电子邮件不是幂等的,因此我们建议 Meteor 方法应该将这些电子邮件添加到队列中,并按计划让不同的服务处理队列。但是,我们不想开始实施可能有助于解决问题的解决方案。

所以,这给我留下了两个问题:

  • 究竟什么会导致 Meteor 方法被调用 127 次?我们如何防止这种情况发生?这是 Meteor 中的错误还是我们应用中的错误?
  • 如果我们更新方法使其使用 EmailQueue.insert(...)(并让其他东西处理队列),这是否意味着在这种情况下,我们会将 127 条记录放入队列中?这里唯一的解决方案是否具有某种锁定以确保不处理/插入重复记录?

感谢您提供任何见解。

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

    我建议您发布代码,该过程可能很简单,但通常有一些小的子组件可以帮助确定发生了什么,即它是异步的/是否有任何可能阻塞的东西。

    什么原因造成的

    如果 Meteor 没有响应您的浏览器,它认为它还没有触发调用并重新调用它。至少这是我可以收集到的可能正在使用您提供的信息发生的事情。

    要通过这个,请确保

    1. 发送电子邮件时,您可以使用 this.unblock (http://docs.meteor.com/#method_unblock) 或在您正在执行的任何进程中使用异步 JS
    2. 确保没有任何事情阻塞您的应用程序的主线程。 (如果没有任何代码,很难说它是什么)
    3. 错误。如果流星重新启动并重新连接,它将提示浏览器重新发送Meteor.call

    这里的主要线索是它花了 20 分钟,所以很可能是其中任何一个。

    如何检查。检查浏览器中的网络选项卡以查看发送到服务器的内容。该方法是否被多次调用?是否有重新连接尝试?

    要回答关于使用电子邮件队列是否有帮助的第二个问题,它可能不会,这更多地取决于导致初始问题的原因。

    另外:我认为 SendGrid 无论如何都会自动对电子邮件进行排队,因此您可以一次将所有电子邮件发送给他们,然后他们将它们排队,以便根据您对它们的限制发送出去。 (由于我很久以前使用过它们,所以不确定)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      相关资源
      最近更新 更多