gpt4 book ai didi

amazon-web-services - 基于位置的AWS AppSync事件订阅

转载 作者:行者123 更新时间:2023-12-02 23:19:24 26 4
gpt4 key购买 nike

我了解如何通过AppSync执行地理空间查询,以通过将链接到ElasticSesarch的解析器附加为described here来查找距gps坐标一定距离范围内的事件。

但是,如果我希望我的客户也订阅在此距离范围内创建的新事件怎么办?

  • 用户订阅位置
  • (如果在该位置附近创建了一个事件),请通知用户

  • 我知道我可以将解析器附加到订阅类型,但是当我只想通过检查gps坐标之间的距离来过滤订阅时,它似乎迫使您提供数据源。

    最佳答案

    这是一个很大的问题,我想有几种方法可以解决这个问题。这里最困难的部分是您将找到一种方法来问“在此位置的事件中哪些订阅感兴趣”这一问题。这是前进的一种可能途径。

    以下假定这些架构部分:

    // Whatever custom object has a location 
    type Post {
    id: ID!
    title: String
    location: Location
    }
    input PublishPostInput {
    id: ID!
    title: String
    location: Location
    subscriptionID: ID
    }
    type PublishPostOutput {
    id: ID!
    title: String
    location: Location
    subscriptionID: ID
    }

    type Location {
    lat: Float,
    lon: Float
    }
    input LocationInput {
    lat: Float,
    lon: Float
    }

    # A custom type to hold custom tracked subscription information
    # for location discover
    type OpenSubscription {
    subscriptionID: ID!
    location: Location
    timestamp: String!
    }
    type OpenSubscriptionConnection {
    items: [OpenSubscription]
    nextToken: String
    }

    type Query {
    # Query elasticsearch index for relevant subscriptions
    openSubscriptionsNear(location: LocationInput, distance: String): OpenSubscriptionConnection
    }
    type Mutation {
    # This mutation uses a local resolver (e.g. a resolver with a None data source) and simply returns the input as is.
    publishPostToSubscription(input: PublishPostInput): PublishPostOutput
    }
    type Subscription {
    # Anytime someone passes an object with the same subscriptionID to the "publishPostToSubscription" mutation field, get updated.
    listenToSubscription(subscriptionID: ID!): PublishPostOutput
    @aws_subscribe(mutations:["publishPostToSubscription"])
    }

    假设您将DynamoDB用作主要的事实来源,请设置一个DynamoDB流,该流调用“PublishIfInRange” lambda函数。该“PublishIfInRange”函数看起来像这样
    // event - { location: { lat, lon }, id, title, ... }
    function lambdaHandler(event) {

    const relevantSubscriptions = await callGraphql(`
    query GetSubscriptions($location: LocationInput) {
    openSubscriptionsNear(location:$location, distance: "10 miles") {
    subscriptionID
    }
    }
    `, { variables: { location: event.location }})

    for (const subscription of relevantSubscriptions) {
    callGraphql(`
    mutation PublishToSubscription($subID: ID!, $obj: PublishPostInput) {
    publishPostToSubscription(input: $obj) {
    id
    title
    location { lat lon }
    subscriptionID
    }
    }
    `, { variables: { input: { ...subscription, ...event }}})
    }
    }

    您将需要维护按位置索引的订阅注册表。一种实现方法是让您的客户端应用程序调用一个突变,该突变创建具有位置和subscriptionID的预订对象(例如,假设您正在使用$ util.autoId()在解析程序中生成subscriptionID,则为 mutation { makeSubscription(loc: $loc) { ... } })。拥有subscriptionID后,您可以通过graphql进行订阅调用,并将subscriptionID作为参数传递(例如 subscription { listenToSubscription(subscriptionID: "my-id") { id title location { lat lon } } })。当您进行上述订阅时,AppSync会创建一个主题并授权当前用户订阅该主题。该主题对于被调用的订阅字段以及传递给订阅字段的参数集是唯一的。换句话说,主题仅接收对象

    现在,无论何时创建对象,记录都会通过DynamoDB流进入lambda函数。 lambda函数查询elasticsearch该对象附近的所有打开的订阅,然后将记录发布到每个打开的订阅。

    我相信这应该可以使您走得很远,但是如果您在狭窄的季度中拥有数百万的用户,则可能会遇到扩展问题。希望这可以帮助

    关于amazon-web-services - 基于位置的AWS AppSync事件订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51310475/

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