我正在尝试使用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:$userId
为Actor
,entity:$entityId
为Object
。
订阅他的notification:$userId-$orgId
至AdminEntity:$entityId
2)User
加入Organization
:
将有关此活动的活动推送至Org:$orgId
订阅他的notification:$userId-$orgId
至Org:$orgId
。
3)User
购买Entity
:
将有关此事件的活动推送至AdminEntity:$entityId
。
订阅他的notification:$userId-$orgId
至UserEntity:$entityId
等等。
所述模型的问题在于,作为User
的创建者的第一种情况Entity
也将通过Org:$orgId
收到他已创建Entity
以及其他{{}}的通知{1}}成员。与第二种情况相同。
这是通知系统的不良行为。
理想情况下,我们不应通知Organization
他自己在“共享”Feed中的活动,例如User
。问题是 - 如何实现这一目标?也许GS feed应该以不同的方式组织,或者可以通过Org:$orgId
语法来完成?
编辑:我可以看到,可能的解决办法是:
摆脱所有共享Feed,例如Aggregation Format
,Org
,AdminEntity
;
通过UserEntity
电话直接将活动推送至notification:$userId-org$id
Feed,内容涉及组织中的用户角色,与实体的关系等。
我不确定这是否是与GS一起使用的惯用解决方案。
答案 0 :(得分:4)
我认为您的结构可能比您最初设计的更简单,并且更贴近您在帖子底部提到的内容。我还建议你阅读http://blog.getstream.io/best-practices-for-instagram-style-feeds/,这听起来与你想要在这里做的相似。
有关Feed类型的简化细分:
任何Feed类型都可以遵循Flat Feed,但我们通常建议只有平面Feed和聚合Feed跟随其他平面Feed。通知源通常是独立的,我将在下面描述。
让我们做出以下假设:
12
56
是" Acme Inc" 74
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会做的事情:
org
平面Feed中(org:56
)user:74
跟随org:56
usercontent:12
)中,以及来自' To'领域;这完全是可选的当Ian登录时,您的应用现在有几个可能的Feed和选项可供展示,这完全取决于您的应用:
org_aggregated:56
Feed,其中会有一份实体#63 timeline:74
以获取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用于无冲突标识符,但这完全取决于您控制。如果用户真的可以成为多个组织的一部分,那么您可以让该用户跟随'组织的饲料。