只需单击一下按钮,Meteor.call调用方法> 100次

时间:2014-07-23 21:11:12

标签: javascript meteor

我们的团队拥有一个生产级别的Meteor应用程序。在应用程序中,我们有一个发送电子邮件的特定Meteor方法。 今天,只需点击一下“提交”按钮,就会发送127封电子邮件(大约20分钟)。

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

  1. 我们捕获提交事件并通过Meteor.call将所有内容发送到服务器
  2. Meteor方法向服务发送请求以呈现PDF
  3. Meteor方法向SendGrid发送包含附件和其他电子邮件数据的请求
  4. Meteor方法返回并触发回调
  5. 我们确实没有太多基础来确定确切的问题并且正在研究但是怀疑它部分是由于最终用户的连接超时和Meteor重新发送请求而没有得到任何响应。

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

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

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

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

    感谢您的任何见解。

1 个答案:

答案 0 :(得分:0)

我建议您发布代码,过程可能很简单,但通常会有一些小问题可以帮助确定发生了什么,即它是异步/是否存在可能阻塞的内容。

可能导致什么

如果Meteor没有响应您的浏览器,则认为它尚未解除呼叫并重新呼叫它。至少这是我可以使用您提供的信息收集的信息。

要通过,请确保

  1. 发送电子邮件时,您可以使用this.unblockhttp://docs.meteor.com/#method_unblock)或使用异步JS执行您正在执行的任何操作
  2. 确保没有任何事情阻止您的应用的主要线程。 (如果没有任何代码,很难说它可能是什么)
  3. 错误。如果meteor重新启动并重新连接,它将提示浏览器重新发送Meteor.call
  4. 这里的一个重要线索是花了20分钟,所以它很可能是其中任何一个。

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

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

    此外:我认为SendGrid会自动对电子邮件进行排队,因此您可以立即向他们发送所有电子邮件,然后将其排队,以便根据您的限制发送。 (因为我使用它们已经有一段时间了,所以不确定)