【问题标题】:Azure web app to web app communicationAzure Web 应用到 Web 应用的通信
【发布时间】:2016-01-05 23:39:33
【问题描述】:

我在 Azure 中有两个独立的 Web 应用,一个用于管理内容,另一个用于显示此内容。

目前我正在从管理应用程序向公共应用程序发送 http 请求,以清除各种对象的内存缓存。

这很好用,但不会扩展到多个实例。

因此,我开始研究用于通信的发布/订阅模型的服务总线主题。

我从管理应用程序向主题发送消息没有问题,但我无法弄清楚如何从公共应用程序使用这些消息。

在辅助角色或网络作业中执行此操作的示例很多,但我找不到任何从网络应用程序接收消息的示例。

此外,一旦我解决了这个问题,我将需要为每个实例处理单独的订阅。我的想法是在订阅中使用 WEBSITE_INSTANCE_ID。有没有人这样做过,或者对于多个实例有更好的解决方案吗?

或者,有没有更好的方法来处理分布式缓存清除?

【问题讨论】:

  • 为什么管理员应用必须通知公共应用清除缓存?你能做垃圾收集器做的事吗?例如,当缓存达到一定限制时清除缓存(可能是缓存的大小或对象的时间戳)。
  • 使用redis之类的东西,在站点之间共享一个公共缓存服务不是更好吗?
  • @Brendan Green - 如果可能的话,我想使用本地内存缓存 - 没有什么比这更快了。
  • 我没有对此进行过深入的检查,是否可以通过以下方式实现:a) 使用 System.Runtime.Caching.MemoryCache 作为缓存,b) 使用 WebRole 而不是 WebApp,c) 运行服务来自 WebRole“OnStart”入口点的总线消息泵?

标签: .net azure azureservicebus


【解决方案1】:

从网络应用程序或工作者角色接收并没有真正的区别;你只需要在启动时启动一个后台线程来完成这项工作。当机器上的应用程序实例停止运行时,后台线程也应该终止。

如果您使用.NET,最简单的方法是using the OnMessage API,因此您不必编写自己的循环。启动时在应用中创建订阅客户端,并使用回调初始化 OnMessage。当应用程序发出关闭信号时,您将关闭客户端以彻底退出。

使用 instance-id 作为订阅名称的想法很好。如果您想为您的 Web 应用程序实例授予对该主题的“管理”权限,您还可以做的是创建一个以随机标识符(Guid?)命名的 volatile 订阅。

可变订阅在空闲时自动删除(即它们没有被拉上,不需要消息流来保持它们活跃)并且是enabled by the AutoDeleteOnIdle flag

【讨论】:

  • 我尝试过使用 OnMessage api,它是从面向公众的应用程序的 Application_Start 事件触发的。它接收消息,但老实说,它似乎会导致管理应用程序挂起——这没有意义,因为它们位于不同的程序集中。您是否在 Web 应用程序中找到了此 API 的完整示例?
  • 您需要从 Application_Start 中启动一个后台线程,然后在新线程中使用 OnMessage API
  • @CraigSmitham - 你有设置的例子吗?
猜你喜欢
  • 1970-01-01
  • 2017-05-11
  • 2015-06-27
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 2013-04-30
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多