使用GetStream进行通知系统实现

时间:2017-01-11 16:17:08

标签: getstream-io

我正在尝试使用GS实现通知系统

基本上,相关模型是:

  • Organizations(orgs);
  • User,组织成员。用户可以拥有org;
  • 的管理权限 管理员用户可以创建的
  • Entity和普通用户可以购买,实体也属于orgs。

在GS中有以下Feed:

  • notification:$userId-$orgId ----为特定组织中的用户重复使用默认Feed,个人通知Feed
  • Org:$orgId ----所有组织成员的共享Feed
  • AdminEntity:$entityId ----有关用户对管理员用户的实体操作的通知
  • UserEntity:$entityId ----有关普通用户的实体管理/系统操作的通知

让我简要解释一下饲料之间的基本关系:

1)Admin创建Entity

  • 将有关此事件的活动推送至Org:$orgId。活动的user:$userIdActorentity:$entityIdObject

  • 订阅他的notification:$userId-$orgIdAdminEntity:$entityId

2)User加入Organization

  • 将有关此活动的活动推送至Org:$orgId

  • 订阅他的notification:$userId-$orgIdOrg:$orgId

3)User购买Entity

  • 将有关此事件的活动推送至AdminEntity:$entityId

  • 订阅他的notification:$userId-$orgIdUserEntity:$entityId

等等。

所述模型的问题在于,作为User的创建者的第一种情况Entity也将通过Org:$orgId收到他已创建Entity以及其他{{}}的通知{1}}成员。与第二种情况相同。

这是通知系统的不良行为。

理想情况下,我们不应通知Organization他自己在“共享”Feed中的活动,例如User。问题是 - 如何实现这一目标?也许GS feed应该以​​不同的方式组织,或者可以通过Org:$orgId语法来完成?

编辑:我可以看到,可能的解决办法是:

  • 摆脱所有共享Feed,例如Aggregation FormatOrgAdminEntity;

  • 通过UserEntity电话直接将活动推送至notification:$userId-org$id Feed,内容涉及组织中的用户角色,与实体的关系等。

我不确定这是否是与GS一起使用的惯用解决方案。

1 个答案:

答案 0 :(得分:4)

我认为您的结构可能比您最初设计的更简单,并且更贴近您在帖子底部提到的内容。我还建议你阅读http://blog.getstream.io/best-practices-for-instagram-style-feeds/,这听起来与你想要在这里做的相似。

有关Feed类型的简化细分:

  • 通知Feed适用于内容的创建者(" 15个人喜欢您的帖子")。
  • 汇总Feed适用于粉丝("已添加12个帖子")。
  • 平面Feed是添加核心活动的好地方("实体"在您的情况下?),但您也可以使用&#34将这些活动的其他副本保存到其他聚合和通知Feed中;至"活动模型上的字段,类似于CC'电子邮件

任何Feed类型都可以遵循Flat Feed,但我们通常建议只有平面Feed和聚合Feed跟随其他平面Feed。通知源通常是独立的,我将在下面描述。

让我们做出以下假设:

  • 有一位名为" Silverthorne"的管理员用户ID为12
  • 组织ID 56是" Acme Inc"
  • Ian是ID为74
  • 的普通用户
  • Silverthorne准备一些实体内容,当保存到您自己的数据库时,其ID为63

让我们创建一个名为org的平面Feed,其中将进行实体活动,并为汇总数据创建名为org_aggregated的聚合Feed,称为notifications的通知Feed,名为timeline的用户的Feed。如果您的用户可以看到其他用户(而不是组织)撰写的所有内容的Feed,那么我建议使用另一个名为usercontent的平面Feed。

对于Silverthorne将此​​活动发布到GetStream,活动参与者将为"user:12",动词可以为"post",对象将为"entity:63"

要对此进行分析,因为我不知道您正在使用哪个SDK,就像这样:

# acme inc gets created as an organization, and so its aggregated feed
# should follow the org's flat feed
acme_org_feed = getstreamClient->feed('org', '56')
acme_org_agg_feed = getstreamClient->feed('org_aggregated', '56')
acme_org_agg_feed->follow(acme_org_feed)

此时,添加到Acme的org平展Feed的每个实体也会聚合在一起。您可以设置如何在GetStream仪表板上汇总这些内容。

现在,让Ian跟随Acme:

# ian is a member of Acme Inc, so follow their entity feed
ian_feed = getstreamClient->feed('timeline', '74')
ian_feed->follow(acme_org_feed)

如果Ian是新注册,您可以向Acme的通知Feed发送活动,如下所示:

acme_notif_feed = getstreamClient->feed('org_notification', '56')
acme_notif_feed->addActivity({
  'actor': 'user:74',
  'verb': 'registration',
  'object': 'user:74'
})

稍后检索此通知Feed时,它会将所有谓词组合在一起,然后细分通知活动,因此如果您选择,您的用户界面可能会以不同方式报告。

现在让我们让Silverthorne将该实体添加到GetStream中:     #Silverthorne为Acme Inc的实体Feed添加了一项活动     #we' ll" cc"聚合Feed的活动     acme_org_feed-> addActivity({       '演员':'用户:12',       '动词':' post',       '对象':'实体:63',       '到':[' usercontent:12'],       ...您要跟踪的任何其他元数据     })

保存后,这是GetStream会做的事情:

  • 它将活动存储在Acme的org平面Feed中(org:56
  • 它会将副本保存到Ian的时间轴中,因为user:74跟随org:56
  • 的平展Feed
  • 它还可以将副本保存到Silverthorne的饲料(usercontent:12)中,以及来自' To'领域;这完全是可选的
  • 它将副本保存到Acme([{1}})的汇总Feed中,因为汇总的Feed跟随平面Feed

当Ian登录时,您的应用现在有几个可能的Feed和选项可供展示,这完全取决于您的应用:

  • 如果Ian看到他所关注的所有内容的时间表,您就会获取org_aggregated:56 Feed,其中会有一份实体#63
  • 如果Ian看到他所关注的所有组织的列表,您可以获取timeline:74以获取Ian所遵循的每个Feed的列表
  • 对于Ian所关注的每个Feed,您可以为Ian获取该组织的汇总Feed以查看摘要(即,抓取ian_feed->followed()并且Ian可以看到org_aggregated:56如果该&#39 ; s你如何汇总你的内容)

这里的关键是,Ian没有 来关注Feed以查看内容,您的应用可以将任何Feed提取给任何用户。

如果伊恩要分享'或者'喜欢' Silverthorne发布的实体,您在“org_notification”中添加了一项新活动:56'用'用户提供:74'作为演员,'实体:63'是对象,动词是你想要的任何字符串(最多20个字符)。如果您希望自己的应用看到其他用户与组织帖子的互动方式,您可以抓取one new entity added in the past day,所有用户都可以看到" Ian喜欢实体63"或者您的UI需求提出这个。

希望有助于澄清事情并为您提供一些额外的细节。如果您需要进一步的帮助或想法,请通过电子邮件联系我们的支持团队。

作为最后一点,我不认为我做org_notification:56 ...我们的一些SDK(即Rails和Django)会自动尝试丰富&# 39;数据库中的那些值,因此您需要额外的逻辑来尝试稍后拆分这些值。我们建议将UUID用于无冲突标识符,但这完全取决于您控制。如果用户真的可以成为多个组织的一部分,那么您可以让该用户跟随'组织的饲料。