2013-03-23 48 views
0

我在GAE上构建了一个应用程序,当另一个用户执行影响它们的操作时需要通知用户。当你的朋友评论你的Facebook状态时,一个真实的世界比喻会被警告。向用户处理通知

我明白Channel API的工作原理是如何实时发送通知,但我试图理解将这些通知存储在数据存储区中的最有效方法。理想情况下,我希望通知代码与正在执行的实际事件分离。这是一个很好的用例Prospective Search?它并不完全正确,因为我不需要执行任何类型的搜索,只是:如果您看到新评论,则创建一个存储在数据存储中并通过通道api推送到客户端的新通知连接。我基本上需要数据库触发器,但我不认为GAE支持这一点。

+0

为什么感觉前瞻性搜索感觉不对?其他事件必须符合什么标准才能触发通知?您是否可以使用标准查询轻松查询需要通知的所有用户?如果是这样,那么在任务中执行该查询。但是比较两种方法的效率是值得的。预期的搜索查询区域比标准查询更灵活,所以权衡是创建文档模式,而不是额外的工作来制作标准数据库查询 - – 2013-03-24 00:20:57

+0

预期的搜索对于在其他地方创建数据流数据似乎很有用。因此,如果用户执行了搜索,那么我们希望“保持搜索正在运行”,并在用户查看原始结果时发送新匹配给用户。我试图做的更像是几乎所有交易的副作用。 Prospective提供了很多我不需要的灵活性。另外,如果我不需要迁移,我不喜欢与GAE特定的功能绑定。 – wlindner 2013-03-24 16:37:59

回答

1

你为什么不想要在第一页中将事件和通知结合起来花边? 我认为这可能是有趣的知道,以帮助您的使用情况:)

如果我不得不这样做,我会启动一个任务队列,我写任何可能触发事件的数据存储... 这样你就可以做你的写作,并有一个单独的“层”来处理事件。 触发器甚至不会是一个很好的选项,因为您的应用程序必须“轮询”数据库以将事件推送到用户的用户界面。

我认为你的进程(触发事件)不属于数据库,因为它可能需要数据存储不能提供的业务规则:例如,当用户忽略另一个时,你不应该触发事件。 您放入数据库系统的业务逻辑越多,维护得越复杂&规模恕我直言......

+0

我调查这个问题的次数越多,我认为将这些事情联系起来就越好。我不认为真的有办法解决这个问题。似乎任务队列是要走的路,以便用户在执行操作时不必等待触发通知。因此,更多的是这样的:用户执行操作,操作存储在数据库中,用户完成后,操作需要通知另一个用户,但这只是发送到任务队列,以便通知可以在没有原始用户等待的情况下执行。 – wlindner 2013-03-24 16:45:00

0

看起来像GAE支持使用hooks模仿数据库触发器。

钩子可以

  1. 查询缓存
  2. 审计数据存储活动每个用户
  3. 模仿数据库是有用的触发
+0

但是,这些都在面向用户的事务中运行,如果它们是复杂的查询,这可能会降低用户体验。无论哪种方式,如果你必须做很多的通知,你会想要使用任务来实际执行通知 – 2013-03-24 00:22:36

+0

好点,使用挂钩可能会减慢用户体验,我会研究任务队列。 – wlindner 2013-03-24 16:39:45

+0

我发现数据库钩子并不是我想要的。他们不允许我知道放置数据存储对象时发生了什么变化,所以我无法发送特定类型的通知,具体取决于发生了什么变化。 – wlindner 2013-03-24 16:46:22