Request for a specific Azure website instance という面白いネタがあったので試してみました。
Azure WebサイトではARRAffinityを使ってインスタンスの振り分けを行ってたりします。接続元やら負荷を見てある程度振り先を固定してるみたいですね。このあたりはしばやん先生が詳しいと思います。
というわけで、インスタンスIDやらなにやらを確認してみましょう。基本は環境変数に入ってるみたいですね。
とりあえずWebアプリで表示してみましょう。
public ActionResult Index()
{
ViewBag.InstanceId = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID");
ViewBag.SiteName = Environment.GetEnvironmentVariable("WEBSITE_SITE_NAME");
ViewBag.ARRAffinity = Request.Cookies.Get("ARRAffinity") == null ? "" : Request.Cookies.Get("ARRAffinity").Value;
return View();
}
こんな感じで吐き出します。
結果は以下の通り。
IDが違いますね。基本的にInstanceIDとARRAffinityは同じになるようです。
※2インスタンスにして試しました。
さて同じ内容をテキストで吐くようなアクションを用意しておいて、インスタンスIDを指定して接続してみるクライアントを作ってみます。
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string instanceId = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID");
string siteName = Environment.GetEnvironmentVariable("WEBSITE_SITE_NAME");
if (string.IsNullOrEmpty(instanceId))
{
Console.Write("input InstanceId: ");
instanceId = Console.ReadLine();
}
if (string.IsNullOrEmpty(siteName))
{
Console.Write("input SiteName: ");
siteName = Console.ReadLine();
}
var url = new Uri("http://" + siteName + ".azurewebsites.net/Home/Info");
var response = GetFromInstance(url, instanceId).Result;
Console.WriteLine("result =============");
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
Console.ReadLine();
}
private static async Task<HttpResponseMessage> GetFromInstance(Uri url, string instanceId)
{
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
{
using (var httpClient = new HttpClient(handler))
{
cookieContainer.Add(url, new Cookie("ARRAffinity", instanceId));
return await httpClient.GetAsync(url);
}
}
}
}
}
環境変数がなかったら入力されたものを使います。
結果は↓
ちゃんといけてるみたいですね。ちなみに無効なInstanceIdを指定した場合は?
適当に振り分けられるみたいです。なるほど。
Kudu上で実行してみると環境変数がとれるので、今自分が動いているインスタンスIDなどは気にせず自分自身に接続することができます。
まぁKuduのEnvironment見ればInstanceIdはわかるのですけど。
というわけで、WebJobsなりなんなりでいろいろしたい場合に覚えておくといいかと思います。