Основной выбор:
Преимуществом горизонтального масштабирования в облаке является возможность добавлять / удалять серверы на основе рабочей нагрузки . Когда все занято, добавьте больше серверов. Когда все тихо, удалите серверы. Это также позволяет снизить затраты, когда все тихо (что невозможно на месте, если у вас есть собственное оборудование).
Архитектура предполагает размещение нескольких серверов за балансировщиком нагрузки:
AWS имеет несколько доступных балансировщиков нагрузки, которые варьируются в зависимости от необходимость. Если вы просто отправляете трафик одному приложению, установленному на всех серверах, то Network Load Balancer должно быть достаточно. В ситуациях, когда разные части приложения находятся на разных серверах (например, мобильный интерфейс или веб-интерфейс), вы можете использовать Балансировщик нагрузки приложения .
AWS также помогает с горизонтальным масштабированием, предоставляя сервис Amazon EC2 Auto Scaling . Это позволяет вам указать подробную информацию о серверах для запуска (образ диска, тип экземпляра, сетевые настройки), а затем автоматическое масштабирование может автоматически запускать новых серверов при необходимости и завершать тех, которые не ' т требуется. (Обратите внимание, что они запускаются и завершаются, а не запускаются и останавливаются.)
Вы можете дополнительно определить политики масштабирования , которые сообщают автоматическому масштабированию , когда запускать / завершать экземпляры, измеряя метрики, такие как загрузка процессора. Таким образом, количество серверов может приблизительно соответствовать объему трафика.
Следует отметить, что если у вас есть база данных , она должна храниться отдельно на серверах приложений, чтобы она не была завершена. Вы можете использовать Amazon Relational Database Service (RDS) для запуска базы данных для вас, или вы можете запустить ее на отдельном экземпляре Amazon EC2.
Если вы хотите узнать больше о любой из вышеперечисленных технологий, на YouTube или в блоге есть множество выступлений, которые могут объяснить и продемонстрировать их использование.
от XP SP2 победы вперед Вы можете P/Invoke к GetExtendedTcpTable
Используя добрую работу Этого человека для изложения в деталях подписи (спецификация PInvoke.net является неполной) вот (груб и плох при проверке ошибок) пример
using System;
using System.Runtime.InteropServices;
public enum TCP_TABLE_CLASS : int
{
TCP_TABLE_BASIC_LISTENER,
TCP_TABLE_BASIC_CONNECTIONS,
TCP_TABLE_BASIC_ALL,
TCP_TABLE_OWNER_PID_LISTENER,
TCP_TABLE_OWNER_PID_CONNECTIONS,
TCP_TABLE_OWNER_PID_ALL,
TCP_TABLE_OWNER_MODULE_LISTENER,
TCP_TABLE_OWNER_MODULE_CONNECTIONS,
TCP_TABLE_OWNER_MODULE_ALL
}
[StructLayout(LayoutKind.Sequential)]
public struct MIB_TCPROW_OWNER_PID
{
public uint state;
public uint localAddr;
public byte localPort1;
public byte localPort2;
public byte localPort3;
public byte localPort4;
public uint remoteAddr;
public byte remotePort1;
public byte remotePort2;
public byte remotePort3;
public byte remotePort4;
public int owningPid;
public ushort LocalPort
{
get
{
return BitConverter.ToUInt16(
new byte[2] { localPort2, localPort1}, 0);
}
}
public ushort RemotePort
{
get
{
return BitConverter.ToUInt16(
new byte[2] { remotePort2, remotePort1}, 0);
}
}
}
[StructLayout(LayoutKind.Sequential)]
public struct MIB_TCPTABLE_OWNER_PID
{
public uint dwNumEntries;
MIB_TCPROW_OWNER_PID table;
}
[DllImport("iphlpapi.dll", SetLastError=true)]
static extern uint GetExtendedTcpTable(IntPtr pTcpTable,
ref int dwOutBufLen,
bool sort,
int ipVersion,
TCP_TABLE_CLASS tblClass,
int reserved);
public static MIB_TCPROW_OWNER_PID[] GetAllTcpConnections()
{
MIB_TCPROW_OWNER_PID[] tTable;
int AF_INET = 2; // IP_v4
int buffSize = 0;
// how much memory do we need?
uint ret = GetExtendedTcpTable(IntPtr.Zero,
ref buffSize,
true,
AF_INET,
TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL,
0);
if (ret != 0 && ret != 122) // 122 insufficient buffer size
throw new Exception("bad ret on check " + ret);
IntPtr buffTable = Marshal.AllocHGlobal(buffSize);
try
{
ret = GetExtendedTcpTable(buffTable,
ref buffSize,
true,
AF_INET,
TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL,
0);
if (ret != 0)
throw new Exception("bad ret "+ ret);
// get the number of entries in the table
MIB_TCPTABLE_OWNER_PID tab =
(MIB_TCPTABLE_OWNER_PID)Marshal.PtrToStructure(
buffTable,
typeof(MIB_TCPTABLE_OWNER_PID));
IntPtr rowPtr = (IntPtr)((long)buffTable +
Marshal.SizeOf(tab.dwNumEntries));
tTable = new MIB_TCPROW_OWNER_PID[tab.dwNumEntries];
for (int i = 0; i < tab.dwNumEntries; i++)
{
MIB_TCPROW_OWNER_PID tcpRow = (MIB_TCPROW_OWNER_PID)Marshal
.PtrToStructure(rowPtr, typeof(MIB_TCPROW_OWNER_PID));
tTable[i] = tcpRow;
// next entry
rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(tcpRow));
}
}
finally
{
// Free the Memory
Marshal.FreeHGlobal(buffTable);
}
return tTable;
}
проверьте этот проект: http://www.codeproject.com/KB/IP/iphlpapi.aspx
Это использует Interop в C# для получения до базовой API-функции Победы GetTcpTable. И поэтому может дать Вам идентификатор процесса, который Вы ищете.
надежда, которая помогает, Alex