Мютекс между контейнерами докера.
Цитата: Overd от 15.12.2022, 10:07Здравствуйте, помогите пожалуйста.
Описание проблемы:
У меня есть микросервис который содержит логику кэширования в Redis. На сервере подняты множество экземпляров этого сервиса и они используют единый кэш.
Если на все экземпляры поступает запрос на получение данных из кэша а данныч там нет то ВСЕ экземпляры отправляют запрос на получение данных в базу тем самым нагружая ее.Решение проблемы.
Решение проблемы состоит в том чтобы при запросе в базу установить блокировку между контейнерами через Mutex. Чтобы пока один экземпляр получает данные из базы и поместит их в кэш, другие экземпляры ждали на заблокированном мютексе и потом брали из кэша.Вся логика уже реализована, единственная проблема в том чтобы создавался единый мютекс для всех контейнеров.
Пол гугла перерыл - ноль инфы.
Помогите пожалуйста.Создание единого мютекса я пока что тестирую на консольном приложении.
Ниже предоставил самый стандартный DockerFile.
FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src COPY ["MutexDockerTest/MutexDockerTest.csproj", "MutexDockerTest/"] RUN dotnet restore "MutexDockerTest/MutexDockerTest.csproj" COPY . . WORKDIR "/src/MutexDockerTest" RUN dotnet build "MutexDockerTest.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "MutexDockerTest.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MutexDockerTest.dll"]Ниже предоставлен код из Program.cs
Console.WriteLine("Start"); using (var mutex = new Mutex (false, "mutextUltra")) { if (!mutex.WaitOne (TimeSpan.FromSeconds (1), false)) { Console.WriteLine ("Another app instance is running. Bye!"); Thread.Sleep(1000); return; } RunProgram(); } void RunProgram() { while (true) { Thread.Sleep(2000); Console.WriteLine("Hello"); } }Использован .net 7.0
Здравствуйте, помогите пожалуйста.
Описание проблемы:
У меня есть микросервис который содержит логику кэширования в Redis. На сервере подняты множество экземпляров этого сервиса и они используют единый кэш.
Если на все экземпляры поступает запрос на получение данных из кэша а данныч там нет то ВСЕ экземпляры отправляют запрос на получение данных в базу тем самым нагружая ее.
Решение проблемы.
Решение проблемы состоит в том чтобы при запросе в базу установить блокировку между контейнерами через Mutex. Чтобы пока один экземпляр получает данные из базы и поместит их в кэш, другие экземпляры ждали на заблокированном мютексе и потом брали из кэша.
Вся логика уже реализована, единственная проблема в том чтобы создавался единый мютекс для всех контейнеров.
Пол гугла перерыл - ноль инфы.
Помогите пожалуйста.
Создание единого мютекса я пока что тестирую на консольном приложении.
Ниже предоставил самый стандартный DockerFile.
FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src COPY ["MutexDockerTest/MutexDockerTest.csproj", "MutexDockerTest/"] RUN dotnet restore "MutexDockerTest/MutexDockerTest.csproj" COPY . . WORKDIR "/src/MutexDockerTest" RUN dotnet build "MutexDockerTest.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "MutexDockerTest.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MutexDockerTest.dll"]
Ниже предоставлен код из Program.cs
Console.WriteLine("Start");
using (var mutex = new Mutex (false, "mutextUltra"))
{
if (!mutex.WaitOne (TimeSpan.FromSeconds (1), false))
{
Console.WriteLine ("Another app instance is running. Bye!");
Thread.Sleep(1000);
return;
}
RunProgram();
}
void RunProgram()
{
while (true)
{
Thread.Sleep(2000);
Console.WriteLine("Hello");
}
}
Использован .net 7.0
Цитата: Overd от 16.12.2022, 11:38Решение найдено. Оказывается надо обьявлять Mutex с префиксом "Global\"
Решение найдено. Оказывается надо обьявлять Mutex с префиксом "Global\"