GCP - instance间通信: pubsub进行实例间通信,memcac

时间:2021-07-15 | 标签: | 作者:Q8 | 来源:aimeimeiTS网络

小提示:您能找到这篇{GCP - instance间通信: pubsub进行实例间通信,memcac}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的GCP - instance间通信: pubsub进行实例间通信,memcac内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您!

< ">

< ">GCP-appengine通过version管理应用,你可以在appengine上部署多个version(dev、qa等),而每个version可以有多个instance,一个instance可简单理解为一个基于Spring Boot实现的微服务,当有请求到达时appeng华扬联众公司怎么样ine会根据一定策略选择由哪一个instance处理该请求,如果现有的instance处理的流量已经很多,那么appengine会启动新的instance来处理这个请求,这个行为主要由instance的三种扩缩策略决定:手动、自动和基础。

< ">< font-size: 18px;">背景

< ">应用数据保存在GCP的数据存储组件datastore中,datastore是一个NoSQL数据库。假设我们的应用对其中一部分数据M的操作的QPS要求很高,如果每次都从datastore查询则不能满足需求。

//更新M数据

POST/m



//查询M数据

GET/m

< ">< font-size: 18px;">解决方案



< ">为了加快请求的处理速度,我们在应用启动时(即instance启动时)先将这部分数据全部加载到内存,之后直接从内存中读取,而不是每次都从datastore中查询。这种方式有几个问题需要解决:

< ">1.每次请求到达时不确定appengine会将请求路由给哪一个instance,所以当这部分数据有更新(POST/m)时需要通知该version的所有instance进行数据同步

< ">2.在POST/m请求中要确保所有instance都成功同步了数据(所有instance中M数据保持一致),才能以请求处理成功的状态返回。

< ">< font-size: 18px;">数据同步

< ">instance间通信是一个棘手的问题,因为appengine没有直接提供API或外部组件来完成这件事情,甚至你想将请求发给指定的instance都需要牺牲很多灵活性才能实现。当然大多数情况下请求的路由应该由appengine控制,只有在实现某些特殊需求时才可以考虑一些特殊做法。

< ">数据同步的基本思路是在POST/m时先在< text-decoration: underline;">datastore transactions中更新M数据,事务成功提交后再通过< text-decoration: underline;">pubsub通知所有instance从datastore更新最新数据,所有instance都确认成功更新数据后,请求成功。

< ">通过查阅appengine请求路由说明可以知道通过以下格式的地址可以将请求路由给指定的instance。

https://[INSTANCE_ID]-dot-[VERSION_ID]-dot-[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com

< ">但这种方式需要将扩缩方式设置为< text-decoration: underline;">手动扩缩,而且INSTANCE_ID并不是instance的唯一id,而是一个下标索引,比如version test有3个instance,分别为A、B、C,那么可以保证的是通过test[0]、test[1]、test[2]可以成功访问(遍历)三个instance,但你无法知道test[0]究竟是指向A、B还是C。

< ">pubsub是GCP的消息组件,消息发送后消费者有两种方式消费消息:< text-decoration: underline;">pull和< text-decoration: underline;">push

< ">1.pull:通过拉取的方式消费消息,我们的目的是将“数据同步”这个消息立刻通知到每一个instance,pull的方式需要每一个instance以轮询的方式检查并拉取消息,这样在资源占用和响应速度(POST/m)上都不能满足要求。

< ">2.push:这种方式在消息发到< text-decoration: none;">pubsub的指定topic后,pubsub会立刻把这个消息push到订阅了这个topic的所有< text-decoration: underline;">subscriber(subscriber指定的endpoint处,这里我们的域需要设置为:https://[INSTANCE_ID]-dot-[VERSION_ID]-dot-[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com)。

< ">需要注意的是pubsub的tpoic和subscriber的创建只需要执行一次,可以在version启动后通过< text-decoration: underline;">appengin酒店危机公关宣传e-taskqueue创建n个subscriber,n为这个version的实例数。这意味着实例数量n是个"常数"(只有手动扩缩模式才能确保n为“常数”)。

< ">到这里,在`POST/m`里通知所有instance进行“数据同步”这个消息可以正确发送并最终通知到所有instance了。使用appengine预留的/_ah/push-handlers/.*路径可以简化endpoint的认证和授权,最终的endpoint是下面的形式:

https://[INSTANCE_ID]-dot-[VERSION_ID]-dot-[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com/_ah/push-handlers/your-topic-name

< ">pubsub进行push时每个instance的`POST/_ah/push-handlers/your-topic-name`con哪有小程序troller/handler就会收到请求,并携带着消息内容。在这个请求中,我们可以从消息中知道需要怎样更新数据,进而完成数据同步的任务。

< ">< font-size: 18px;">一致性

< ">上面介绍了数据同步的具体流程,在这个过程中一致性的保证是很重要的,主要体现在数据同步时需要确保所有的instance都成功消费“数据同步”消息POST/m`才能以请求成功处理的状态返回。

< ">在这里version的instance数量n是“常量”,那么我们只需在一个公共的地方维护一个标识A,标识当前已经成功同步的instance数量,当这个A==n时也就意味着所有instance都成功同步了数据。

< ">< text-decoration: underline;">appengine-memcache是主要应用于appengine上的分布式缓存服务,我们可以在上面存储这个唯一标识,POST/m请求中成功发送“数据同步”消息后,就以轮询的方式从memcache中查询A的值,同时在POST/_ah/push-handlers/your-topic-name中要递增A的值,A==n时就表明同步完成



GCP - instance间通信: pubsub进行实例间通信,memcac

上一篇:GCP免费服务被停用后删除资源的简单方法
下一篇:在INS中增加曝光率和关注度的6个技巧


版权声明:以上主题为“GCP - instance间通信: pubsub进行实例间通信,memcac"的内容可能是本站网友自行发布,或者来至于网络。如有侵权欢迎联系我们客服QQ处理,谢谢。
相关内容
推荐内容
扫码咨询
    GCP - instance间通信: pubsub进行实例间通信,memcac
    打开微信扫码或长按识别二维码

小提示:您应该对本页介绍的“GCP - instance间通信: pubsub进行实例间通信,memcac”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通GCP - instance间通信: pubsub进行实例间通信,memcac的相关事宜。

关键词:GCP,-,instance间通信:,pubsub进

关于 | 业务 | 案例 | 免责 | 隐私
客服邮箱:sales@1330.com.cn
电话:400-021-1330 | 客服QQ:865612759
沪ICP备12034177号 | 沪公网安备31010702002418号