Skip to content

Instantly share code, notes, and snippets.

@zellyn
Created June 13, 2023 20:27
Show Gist options
  • Save zellyn/47f7bfade1f7b8b5dcab81b20b7a0848 to your computer and use it in GitHub Desktop.
Save zellyn/47f7bfade1f7b8b5dcab81b20b7a0848 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "python",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8"
},
"kernelspec": {
"name": "python",
"display_name": "Python (Pyodide)",
"language": "python"
}
},
"nbformat_minor": 4,
"nbformat": 4,
"cells": [
{
"cell_type": "markdown",
"source": "# Host redistribution\n\nWhat happens if a load balancer connects clients to a random member of a pool of hosts, and then you roll out a restart, forcing reconnects?",
"metadata": {}
},
{
"cell_type": "code",
"source": "from matplotlib import pyplot as plt\nimport random",
"metadata": {
"trusted": true
},
"execution_count": 5,
"outputs": []
},
{
"cell_type": "markdown",
"source": "### Set up 50 hosts",
"metadata": {}
},
{
"cell_type": "code",
"source": "hosts = [0] * 50",
"metadata": {
"trusted": true
},
"execution_count": 2,
"outputs": []
},
{
"cell_type": "markdown",
"source": "### Allocate 1000 clients randomly",
"metadata": {}
},
{
"cell_type": "code",
"source": "for i in range(1000):\n hosts[random.randrange(len(hosts))] += 1",
"metadata": {
"trusted": true
},
"execution_count": 6,
"outputs": []
},
{
"cell_type": "code",
"source": "plt.barh(range(len(hosts)), hosts)",
"metadata": {
"trusted": true
},
"execution_count": 9,
"outputs": [
{
"execution_count": 9,
"output_type": "execute_result",
"data": {
"text/plain": "<BarContainer object of 50 artists>"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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a/bd7353Ss+l3Kx8/Pvf/44DBw5EZ2dn9dxFF10UnZ2dsX///jqOLH+ee+65aGlpiauvvjpuv/32eOGFF+o9pFwbHByMoaGhMXOrWCxGR0eHuXUGe/fujSuvvDKuueaaWL16dfWbpqeqcrkcEa986aX5dGavvk+nmU+vOHHiROzatStGR0dj0aJFU3ou5SZ8/OMf/4gTJ05EqVQac75UKsXQ0FCdRpU/HR0dsXPnztizZ0/09fXF4OBgfOhDH4qjR4/We2i5dXr+mFtnd+utt8b9998f/f398Y1vfCP27dsXS5cujRMnTtR7aHVx8uTJ6O7ujsWLF8cNN9wQEebTmZzpPkWYT6c9/fTT8Za3vCUKhUJ8/vOfj927d8d11103pedS7r7Vlje2dOnS6n/Pnz8/Ojo6Yt68efHAAw/EZz/72TqOjEawYsWK6n+/973vjfnz58c73/nO2Lt3b9x88811HFl9rFmzJp555hn7qs7i9e6T+XTKNddcE0899VSUy+X4yU9+EitXrox9+/bVe1h1lZuVj8svvzwuvvjiGB4eHnN+eHg4mpub6zSq/Lv00kvj3e9+dzz//PP1HkpunZ4/5lbtrr766rj88sun5Py688474+GHH45f//rXMXfu3Op582ms17tPZzJV59P06dPjXe96V9x4443R29sbCxYsiG9961tTei7lJnxMnz49brzxxujv76+eO3nyZPT398eiRYvqOLJ8e/nll+PPf/5zzJkzp95Dya22trZobm4eM7cqlUoMDAyYW2fxt7/9LV566aUpNb+yLIs777wzdu/eHb/61a+ira1tzOvm0ylnu09nMhXn05mcPHkyjh8/PrXnUr13vP6vXbt2ZYVCIdu5c2d28ODBbNWqVdmll16aDQ0N1XtouXHXXXdle/fuzQYHB7Pf/va3WWdnZ3b55ZdnR44cqffQ6uro0aPZk08+mT355JNZRGTf/OY3syeffDL761//mmVZlm3evDm79NJLs4ceeij7wx/+kC1btixra2vL/vWvf9V55Gm90X06evRotm7dumz//v3Z4OBg9stf/jJ73/vel7W3t2fHjh2r99CTWb16dVYsFrO9e/dmhw8frh7//Oc/q+8xn85+n8ynU7785S9n+/btywYHB7M//OEP2Ze//OWsqakp+/nPf55l2dSdS7kKH1mWZd/+9rezq666Kps+fXp20003ZY899li9h5Qrt912WzZnzpxs+vTp2dvf/vbstttuy55//vl6D6vufv3rX2cR8Zpj5cqVWZadqkdu3LgxK5VKWaFQyG6++ebs2Wefre+g6+CN7tM///nP7JZbbsmuuOKK7E1velM2b9687HOf+9yUC/9nuj8RkX3/+9+vvsd8Ovt9Mp9O+cxnPpPNmzcvmz59enbFFVdkN998czV4ZNnUnUtNWZZl6dZZAICpLjd7PgCAqUH4AACSEj4AgKSEDwAgKeEDAEhK+AAAkhI+AICkhA8AICnhAwBISvgAAJISPgCApIQPACCp/wfnF9nSOr2wgQAAAABJRU5ErkJggg=="
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": "### Simulate a gradual rollout\n\nFor each host, distribute its clients randomly across the other hosts, simulating a rolling restart.",
"metadata": {}
},
{
"cell_type": "code",
"source": "for host in range(len(hosts)):\n for i in range(hosts[host]):\n pos = host\n while pos == host:\n pos = random.randrange(len(hosts))\n hosts[pos] += 1\n hosts[host] = 0",
"metadata": {
"trusted": true
},
"execution_count": 10,
"outputs": []
},
{
"cell_type": "code",
"source": "plt.barh(range(len(hosts)), hosts)",
"metadata": {
"trusted": true
},
"execution_count": 11,
"outputs": [
{
"execution_count": 11,
"output_type": "execute_result",
"data": {
"text/plain": "<BarContainer object of 50 artists>"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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5eaL5f7617/GuXPnolgsjrlfLBbjd7/7XY1GxesNDQ1FRFxwnl59jYl3/vz56OrqiiVLlsRtt90WEeam1o4fPx6LFy+OM2fOxFvf+tY4ePBg3HrrrfGrX/0qIsxLrRw4cCCeffbZOHLkyBte899M7eQmfACXbu3atfH888/HL3/5y1oPhf/vlltuiWPHjkWpVIof/vCHsWrVqujr66v1sK5qg4ODsW7dunjiiSdi2rRptR4Or5GbbZe3v/3tce2118bw8PCY+8PDw9HU1FSjUfF6r86Feaqde++9Nx577LH4xS9+EXPnzq3cNze1NXXq1HjnO98ZCxcujO7u7pg/f35885vfNC81dPTo0Th16lS8733viylTpsSUKVOir68vdu/eHVOmTKmseJib9HITPqZOnRoLFy6M3t7eyr3z589Hb29vLF68uIYj47VaW1ujqalpzDyVy+Xo7+83TxMsy7K499574+DBg/Hzn/88Wltbx7xubvLl/PnzcfbsWfNSQ8uWLYvjx4/HsWPHKtf73//+uPvuu+PYsWNx8803m5taqfWJ19c6cOBA1tjYmO3fvz87ceJEtnr16uy6667LhoaGaj20q8rp06ez5557LnvuueeyiMi+8Y1vZM8991z2xz/+McuyLNu+fXt23XXXZT/+8Y+z3/zmN9ny5cuz1tbW7B//+EeNR17f1qxZkxUKhezJJ5/MTp48Wbn+/ve/V95jbmrjy1/+ctbX15cNDAxkv/nNb7Ivf/nLWUNDQ/azn/0syzLzkievbbtkmbmplVyFjyzLsgceeCC76aabsqlTp2aLFi3Knn766VoP6arzi1/8IouIN1yrVq3Ksuw/9bTNmzdnxWIxa2xszJYtW5a98MILtR30VeBCcxIR2UMPPVR5j7mpjc997nPZO97xjmzq1KnZDTfckC1btqwSPLLMvOTJ68OHuamNhizLstqsuQAAV6PcnPkAAK4OwgcAkJTwAQAkJXwAAEkJHwBAUsIHAJCU8AEAJCV8AABJCR8AQFLCBwCQlPABACQlfAAASf0/9su9c7Pyn2AAAAAASUVORK5CYII="
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": "",
"metadata": {},
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment