gpt4 book ai didi

getstream-io - 使用GetStream实现通知系统

转载 作者:行者123 更新时间:2023-12-04 04:51:01 25 4
gpt4 key购买 nike

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

基本上,相关模型为:


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


在GS中,有以下供稿:


notification:$userId-$orgId ----重复使用的默认供稿,某些组织中用户的个人通知供稿
Org:$orgId ----所有组织成员的共享供稿
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成员一起创建Organization的通知。第二种情况也是一样。

这是通知系统的有害行为。

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

编辑:如我所见,可能的解决方案可以是:


删除所有共享的提要,例如AdminEntityUserEntitynotification:$userId-org$id
通过add_to_many调用将有关用户在组织中的角色,与实体之间的关系等活动直接推送到 提要。


我不确定这是否是用于GS的惯用解决方案。

最佳答案

我认为您的结构可能比您最初设计的要简单,并且更接近您在文章底部提到的内容。我还建议您通读http://blog.getstream.io/best-practices-for-instagram-style-feeds/,这听起来与您想要在此处进行的操作类似。

为了简化我们的Feed类型的细分:


通知供稿用于内容的创建者(“有15个人喜欢您的帖子”)。
汇总的供稿用于关注者(“添加了12个帖子”)。
固定供稿是添加核心活动(在您的情况下是“实体”?)的好地方,但是您也可以使用活动模型上的“收件人”字段将这些活动的其他副本保存到其他汇总供稿和通知供稿中,类似于抄送电子邮件


任何Feed类型都可以使用Flat Feed,但我们通常建议仅Flat Feed和汇总Feed跟随其他Flat Feed。通知供稿通常独立存在,我将在下面进行描述。

让我们做以下假设:


有一个名为“ Silverthorne”的管理员用户,其ID为12
组织ID 56是“ Acme Inc”
Ian是ID为74的常规用户。
Silverthorne准备一些实体内容,将其保存到自己的数据库中后,其ID为63


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

为了使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统一供稿中的每个实体也将被汇总。您可以设置如何在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的通知供稿,如下所示:

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


以后检索此通知feed时,它将所有动词归为一组,然后细分通知活动,因此,如果您选择,您的UI可以报告不同的活动。

现在让我们让Silverthorne将实体添加到GetStream中:
#Silverthorne为Acme Inc的实体供稿添加了活动
#我们将活动“ cc”到汇总的供稿
acme_org_feed-> addActivity({
'演员':'用户:12',
'verb':'post',
'object':'entity:63',
'至':['usercontent:12'],
...您要跟踪的任何其他元数据
})

保存此内容后,GetStream将执行以下操作:


它将活动存储在Acme( org)的 org:56固定供稿中
它将副本保存到Ian的时间轴中,因为 user:74遵循 org:56的固定供稿
它还将“收件人”字段中的副本保存到Silverthorne的提要( usercontent:12);这是完全可选的
它将副本保存到Acme( org_aggregated:56)的聚合提要中,因为聚合提要遵循平面提要


Ian登录后,您的应用程序现在将显示几个可能的供稿和选项,这完全取决于您的应用程序:


如果Ian应该看到他遵循的所有时间表,则可以获取 timeline:74供稿,其中应包含Entity#63的副本
如果Ian应该看到他关注的所有组织的列表,则可以获取 ian_feed->followed()以获得Ian关注的每个供稿的列表
对于Ian遵循的每个提要,您可以为Ian提取该组织的汇总提要以查看摘要(即,如果是这样汇总内容,则提取 org_aggregated:56,而Ian可以看到 one new entity added in the past day


此处的关键是Ian不必遵循供稿即可查看内容,您的应用可以拉出任何供稿以显示给任何用户。

如果Ian要“分享”或“喜欢” Silverthorne发布的实体,则可以在“ org_notification:56”供稿中添加一个新活动,并以“ user:74”作为Actor,而“ entity:63”是对象,动词是您想要的任何字符串(最多20个字符)。如果您希望您的应用查看其他用户如何与该组织的帖子进行交互,则可以获取 org_notification:56,所有用户都可以看到“ Ian liked实体63”,或者您的UI需要显示该内容。

希望这有助于澄清问题,并为您提供更多详细信息。如果您需要进一步的帮助或想法,请通过电子邮件与我们的支持团队联系。

最后一点,我不认为我会做 $userId-$orgId ...我们的某些SDK(例如Rails和Django)会自动尝试“丰富”数据库中的这些值,因此您需要其他稍后尝试拆分这些值的逻辑。我们建议将UUID用作无冲突标识符,但这完全由您控制。如果一个用户确实可以属于多个组织,则只需让该用户“关注”组织的供稿即可。

关于getstream-io - 使用GetStream实现通知系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41595704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com