diff --git a/README.md b/README.md index bde7c9a..4e5fc23 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Download [Docker Desktop](https://www.docker.com/products/docker-desktop) for Ma ## Linux Containers -The Linux stack uses Python, Node.js, .NET Core (or optionally Java), with Redis for messaging and Postgres for storage. +The Linux stack uses Python, Node.js, .NET Core, with Redis for messaging and Postgres for storage. > If you're using [Docker Desktop on Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows), you can run the Linux version by [switching to Linux containers](https://docs.docker.com/docker-for-windows/#switch-between-windows-and-linux-containers), or run the Windows containers version. @@ -30,26 +30,6 @@ Once you have your swarm, in this directory run: docker stack deploy --compose-file docker-stack.yml vote ``` -## Windows Containers - -An alternative version of the app uses Windows containers based on Nano Server. This stack runs on .NET Core, using [NATS](https://nats.io) for messaging and [TiDB](https://github.com/pingcap/tidb) for storage. - -You can build from source using: - -``` -docker compose -f docker-compose-windows.yml build -``` - -Then run the app using: - -``` -docker compose -f docker-compose-windows.yml up -d -``` - -> Or in a Windows swarm, run `docker stack deploy -c docker-stack-windows.yml vote` - -The app will be running at [http://localhost:5000](http://localhost:5000), and the results will be at [http://localhost:5001](http://localhost:5001). - Run the app in Kubernetes ------------------------- @@ -85,7 +65,7 @@ Architecture * A front-end web app in [Python](/vote) or [ASP.NET Core](/vote/dotnet) which lets you vote between two options * A [Redis](https://hub.docker.com/_/redis/) or [NATS](https://hub.docker.com/_/nats/) queue which collects new votes -* A [.NET Core](/worker/src/Worker), [Java](/worker/src/main) or [.NET Core 2.1](/worker/dotnet) worker which consumes votes and stores them in… +* A [.NET Core](/worker/) worker which consumes votes and stores them in… * A [Postgres](https://hub.docker.com/_/postgres/) or [TiDB](https://hub.docker.com/r/dockersamples/tidb/tags/) database backed by a Docker volume * A [Node.js](/result) or [ASP.NET Core SignalR](/result/dotnet) webapp which shows the results of the voting in real time diff --git a/docker-compose-javaworker.yml b/docker-compose-javaworker.yml deleted file mode 100644 index 544865b..0000000 --- a/docker-compose-javaworker.yml +++ /dev/null @@ -1,57 +0,0 @@ -version: "3" - -services: - vote: - build: ./vote - command: python app.py - volumes: - - ./vote:/app - ports: - - "5000:80" - networks: - - front-tier - - back-tier - - result: - build: ./result - command: nodemon server.js - volumes: - - ./result:/app - ports: - - "5001:80" - - "5858:5858" - networks: - - front-tier - - back-tier - - worker: - build: - context: ./worker - dockerfile: Dockerfile.j - networks: - - back-tier - - redis: - image: redis:alpine - container_name: redis - ports: ["6379"] - networks: - - back-tier - - db: - image: postgres:9.4 - container_name: db - environment: - POSTGRES_USER: "postgres" - POSTGRES_PASSWORD: "postgres" - volumes: - - "db-data:/var/lib/postgresql/data" - networks: - - back-tier - -volumes: - db-data: - -networks: - front-tier: - back-tier: diff --git a/docker-compose-windows-1809.yml b/docker-compose-windows-1809.yml deleted file mode 100644 index 8c5c11e..0000000 --- a/docker-compose-windows-1809.yml +++ /dev/null @@ -1,48 +0,0 @@ -version: "3.2" - -services: - vote: - image: dockersamples/examplevotingapp_vote:dotnet-nanoserver-1809 - build: - context: ./vote/dotnet - dockerfile: Dockerfile.1809 - ports: - - "5000:80" - depends_on: - - message-queue - - result: - image: dockersamples/examplevotingapp_result:dotnet-nanoserver-1809 - build: - context: ./result/dotnet - dockerfile: Dockerfile.1809 - ports: - - "5001:80" - environment: - - "ConnectionStrings:ResultData=Server=db;Port=4000;Database=votes;User=root;SslMode=None" - depends_on: - - db - - worker: - image: dockersamples/examplevotingapp_worker:dotnet-nanoserver-1809 - build: - context: ./worker/dotnet - dockerfile: Dockerfile.1809 - environment: - - "ConnectionStrings:VoteData=Server=db;Port=4000;Database=votes;User=root;SslMode=None" - depends_on: - - message-queue - - db - - message-queue: - image: nats:2.0.4 - - db: - image: dockersamples/tidb:nanoserver-1809 - ports: - - "3306:4000" - -networks: - default: - external: - name: nat diff --git a/docker-compose-windows.yml b/docker-compose-windows.yml deleted file mode 100644 index 4037238..0000000 --- a/docker-compose-windows.yml +++ /dev/null @@ -1,45 +0,0 @@ -version: "3.2" - -services: - vote: - image: dockersamples/examplevotingapp_vote:dotnet-nanoserver-sac2016 - build: - context: ./vote/dotnet - ports: - - "5000:80" - depends_on: - - message-queue - - result: - image: dockersamples/examplevotingapp_result:dotnet-nanoserver-sac2016 - build: - context: ./result/dotnet - ports: - - "5001:80" - environment: - - "ConnectionStrings:ResultData=Server=db;Port=4000;Database=votes;User=root;SslMode=None" - depends_on: - - db - - worker: - image: dockersamples/examplevotingapp_worker:dotnet-nanoserver-sac2016 - build: - context: ./worker/dotnet - environment: - - "ConnectionStrings:VoteData=Server=db;Port=4000;Database=votes;User=root;SslMode=None" - depends_on: - - message-queue - - db - - message-queue: - image: nats:nanoserver - - db: - image: dockersamples/tidb:nanoserver - ports: - - "3306:4000" - -networks: - default: - external: - name: nat \ No newline at end of file diff --git a/docker-stack-windows-1809.yml b/docker-stack-windows-1809.yml deleted file mode 100644 index 2001702..0000000 --- a/docker-stack-windows-1809.yml +++ /dev/null @@ -1,49 +0,0 @@ -version: "3.2" - -services: - vote: - image: dockersamples/examplevotingapp_vote:dotnet-nanoserver-1809 - ports: - - "5000:80" - deploy: - mode: replicated - replicas: 4 - networks: - - frontend - - backend - - result: - image: dockersamples/examplevotingapp_result:dotnet-nanoserver-1809 - environment: - - "ConnectionStrings:ResultData=Server=db;Port=4000;Database=votes;User=root;SslMode=None" - ports: - - "5001:80" - networks: - - frontend - - backend - - worker: - image: dockersamples/examplevotingapp_worker:dotnet-nanoserver-1809 - environment: - - "ConnectionStrings:VoteData=Server=db;Port=4000;Database=votes;User=root;SslMode=None" - deploy: - mode: replicated - replicas: 3 - networks: - - backend - - message-queue: - image: dockersamples/nats:nanoserver-1809 - networks: - - backend - - db: - image: dockersamples/tidb:nanoserver-1809 - ports: - - "3306:4000" - networks: - - backend - -networks: - frontend: - backend: \ No newline at end of file diff --git a/docker-stack-windows.yml b/docker-stack-windows.yml deleted file mode 100644 index 1cd6e81..0000000 --- a/docker-stack-windows.yml +++ /dev/null @@ -1,61 +0,0 @@ -version: "3.2" - -services: - vote: - image: dockersamples/examplevotingapp_vote:dotnet-nanoserver-sac2016 - ports: - - mode: host - target: 80 - published: 5000 - deploy: - endpoint_mode: dnsrr - networks: - - frontend - - backend - - result: - image: dockersamples/examplevotingapp_result:dotnet-nanoserver-sac2016 - environment: - - "ConnectionStrings:ResultData=Server=db;Port=4000;Database=votes;User=root;SslMode=None" - ports: - - mode: host - target: 80 - published: 5001 - deploy: - endpoint_mode: dnsrr - networks: - - frontend - - backend - - worker: - image: dockersamples/examplevotingapp_worker:dotnet-nanoserver-sac2016 - environment: - - "ConnectionStrings:VoteData=Server=db;Port=4000;Database=votes;User=root;SslMode=None" - deploy: - endpoint_mode: dnsrr - mode: replicated - replicas: 3 - networks: - - backend - - message-queue: - image: nats:nanoserver - deploy: - endpoint_mode: dnsrr - networks: - - backend - - db: - image: dockersamples/tidb:nanoserver - ports: - - mode: host - target: 4000 - published: 3306 - deploy: - endpoint_mode: dnsrr - networks: - - backend - -networks: - frontend: - backend: \ No newline at end of file diff --git a/worker/.classpath b/worker/.classpath deleted file mode 100644 index 71f5fef..0000000 --- a/worker/.classpath +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/worker/.project b/worker/.project deleted file mode 100644 index 49e0d9a..0000000 --- a/worker/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - worker - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/worker/.settings/org.eclipse.jdt.apt.core.prefs b/worker/.settings/org.eclipse.jdt.apt.core.prefs deleted file mode 100644 index d4313d4..0000000 --- a/worker/.settings/org.eclipse.jdt.apt.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.apt.aptEnabled=false diff --git a/worker/.settings/org.eclipse.jdt.core.prefs b/worker/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 1eb325e..0000000 --- a/worker/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,7 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.processAnnotations=disabled -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.7 diff --git a/worker/.settings/org.eclipse.m2e.core.prefs b/worker/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/worker/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/worker/Dockerfile b/worker/Dockerfile index 89739f8..b53da1b 100644 --- a/worker/Dockerfile +++ b/worker/Dockerfile @@ -1,16 +1,32 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as builder +# because of dotnet, we always build on amd64, and target platforms in cli +# dotnet doesn't support QEMU for building or running. +# (errors common in arm/v7 32bit) https://github.com/dotnet/dotnet-docker/issues/1537 +# https://hub.docker.com/_/microsoft-dotnet +# hadolint ignore=DL3029 +FROM --platform=${BUILDPLATFORM} mcr.microsoft.com/dotnet/sdk:7.0 as build +ARG TARGETPLATFORM +ARG BUILDPLATFORM +RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" -WORKDIR /Worker -COPY src/Worker/Worker.csproj . -RUN dotnet restore +WORKDIR /source +COPY *.csproj . +RUN case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=x64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && dotnet restore -r linux-${ARCH} -COPY src/Worker/ . -RUN dotnet publish -c Release -o /out Worker.csproj +COPY . . +RUN case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=x64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && dotnet publish -c release -o /app -r linux-${ARCH} --self-contained false --no-restore # app image -FROM mcr.microsoft.com/dotnet/core/runtime:3.1 - +FROM mcr.microsoft.com/dotnet/runtime:7.0 WORKDIR /app -ENTRYPOINT ["dotnet", "Worker.dll"] - -COPY --from=builder /out . \ No newline at end of file +COPY --from=build /app . +ENTRYPOINT ["dotnet", "Worker.dll"] \ No newline at end of file diff --git a/worker/Dockerfile.j b/worker/Dockerfile.j deleted file mode 100644 index 85c33a5..0000000 --- a/worker/Dockerfile.j +++ /dev/null @@ -1,17 +0,0 @@ -FROM maven:3.5-jdk-8-alpine AS build - -WORKDIR /code - -COPY pom.xml /code/pom.xml -RUN ["mvn", "dependency:resolve"] -RUN ["mvn", "verify"] - -# Adding source, compile and package into a fat jar -COPY ["src/main", "/code/src/main"] -RUN ["mvn", "package"] - -FROM openjdk:8-jre-alpine - -COPY --from=build /code/target/worker-jar-with-dependencies.jar / - -CMD ["java", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-jar", "/worker-jar-with-dependencies.jar"] diff --git a/worker/src/Worker/Program.cs b/worker/Program.cs similarity index 96% rename from worker/src/Worker/Program.cs rename to worker/Program.cs index 58fd7ac..9b5fb74 100644 --- a/worker/src/Worker/Program.cs +++ b/worker/Program.cs @@ -48,8 +48,10 @@ namespace Worker Console.WriteLine("Reconnecting DB"); pgsql = OpenDbConnection("Server=db;Username=postgres;Password=postgres;"); } - // Normal +1 vote requested - UpdateVote(pgsql, vote.voter_id, vote.vote); + else + { // Normal +1 vote requested + UpdateVote(pgsql, vote.voter_id, vote.vote); + } } else { @@ -149,4 +151,4 @@ namespace Worker } } } -} +} \ No newline at end of file diff --git a/worker/Worker.csproj b/worker/Worker.csproj new file mode 100644 index 0000000..0084507 --- /dev/null +++ b/worker/Worker.csproj @@ -0,0 +1,14 @@ + + + + Exe + net7.0 + + + + + + + + + \ No newline at end of file diff --git a/worker/dotnet/Dockerfile b/worker/dotnet/Dockerfile deleted file mode 100644 index f87478e..0000000 --- a/worker/dotnet/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM microsoft/dotnet:2.1-sdk-nanoserver-sac2016 as builder - -WORKDIR /Worker -COPY Worker/Worker.csproj . -RUN dotnet restore - -COPY /Worker . -RUN dotnet publish -c Release -o /out Worker.csproj - -# app image -FROM microsoft/dotnet:2.1-runtime-nanoserver-sac2016 - -WORKDIR /app -ENTRYPOINT ["dotnet", "Worker.dll"] - -COPY --from=builder /out . \ No newline at end of file diff --git a/worker/dotnet/Dockerfile.1809 b/worker/dotnet/Dockerfile.1809 deleted file mode 100644 index 4f1b9d2..0000000 --- a/worker/dotnet/Dockerfile.1809 +++ /dev/null @@ -1,16 +0,0 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as builder - -WORKDIR /Worker -COPY Worker/Worker.csproj . -RUN dotnet restore - -COPY /Worker . -RUN dotnet publish -c Release -o /out Worker.csproj - -# app image -FROM mcr.microsoft.com/dotnet/core/runtime:3.1 - -WORKDIR /app -ENTRYPOINT ["dotnet", "Worker.dll"] - -COPY --from=builder /out . \ No newline at end of file diff --git a/worker/dotnet/Worker/Data/IVoteData.cs b/worker/dotnet/Worker/Data/IVoteData.cs deleted file mode 100644 index b0e67cb..0000000 --- a/worker/dotnet/Worker/Data/IVoteData.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Worker.Data -{ - public interface IVoteData - { - void Set(string voterId, string vote); - } -} \ No newline at end of file diff --git a/worker/dotnet/Worker/Data/MySqlVoteData.cs b/worker/dotnet/Worker/Data/MySqlVoteData.cs deleted file mode 100644 index 46ce131..0000000 --- a/worker/dotnet/Worker/Data/MySqlVoteData.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Microsoft.Extensions.Logging; -using Worker.Entities; - -namespace Worker.Data -{ - public class MySqlVoteData : IVoteData - { - private readonly VoteContext _context; - private readonly ILogger _logger; - - public MySqlVoteData(VoteContext context, ILogger logger) - { - _context = context; - _logger = logger; - } - - public void Set(string voterId, string vote) - { - var currentVote = _context.Votes.Find(voterId); - if (currentVote == null) - { - _context.Votes.Add(new Vote - { - VoterId = voterId, - VoteOption = vote - }); - } - else if (currentVote.VoteOption != vote) - { - currentVote.VoteOption = vote; - } - _context.SaveChanges(); - } - } -} \ No newline at end of file diff --git a/worker/dotnet/Worker/Entities/Vote.cs b/worker/dotnet/Worker/Entities/Vote.cs deleted file mode 100644 index 72a66ca..0000000 --- a/worker/dotnet/Worker/Entities/Vote.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace Worker.Entities -{ - [Table("votes")] - public class Vote - { - [Column("id")] - [Key] - public string VoterId { get; set; } - - [Column("vote")] - public string VoteOption { get; set; } - } -} diff --git a/worker/dotnet/Worker/Entities/VoteContext.cs b/worker/dotnet/Worker/Entities/VoteContext.cs deleted file mode 100644 index cdd61e7..0000000 --- a/worker/dotnet/Worker/Entities/VoteContext.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.EntityFrameworkCore; - -namespace Worker.Entities -{ - public class VoteContext : DbContext - { - private static bool _EnsureCreated; - public VoteContext(DbContextOptions options) : base(options) - { - if (!_EnsureCreated) - { - Database.EnsureCreated(); - _EnsureCreated = true; - } - } - - public DbSet Votes { get; set; } - } -} diff --git a/worker/dotnet/Worker/Messaging/IMessageQueue.cs b/worker/dotnet/Worker/Messaging/IMessageQueue.cs deleted file mode 100644 index 8c81029..0000000 --- a/worker/dotnet/Worker/Messaging/IMessageQueue.cs +++ /dev/null @@ -1,12 +0,0 @@ -using NATS.Client; -using Worker.Messaging.Messages; - -namespace Worker.Messaging -{ - public interface IMessageQueue - { - IConnection CreateConnection(); - - void Publish(TMessage message) where TMessage : Message; - } -} \ No newline at end of file diff --git a/worker/dotnet/Worker/Messaging/MessageHelper.cs b/worker/dotnet/Worker/Messaging/MessageHelper.cs deleted file mode 100644 index 909166b..0000000 --- a/worker/dotnet/Worker/Messaging/MessageHelper.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Newtonsoft.Json; -using Worker.Messaging.Messages; -using System.Text; - -namespace Worker.Messaging -{ - public class MessageHelper - { - public static byte[] ToData(TMessage message) - where TMessage : Message - { - var json = JsonConvert.SerializeObject(message); - return Encoding.Unicode.GetBytes(json); - } - - public static TMessage FromData(byte[] data) - where TMessage : Message - { - var json = Encoding.Unicode.GetString(data); - return (TMessage)JsonConvert.DeserializeObject(json); - } - } -} diff --git a/worker/dotnet/Worker/Messaging/MessageQueue.cs b/worker/dotnet/Worker/Messaging/MessageQueue.cs deleted file mode 100644 index 639497e..0000000 --- a/worker/dotnet/Worker/Messaging/MessageQueue.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; -using NATS.Client; -using Worker.Messaging.Messages; - -namespace Worker.Messaging -{ - public class MessageQueue : IMessageQueue - { - protected readonly IConfiguration _configuration; - protected readonly ILogger _logger; - - public MessageQueue(IConfiguration configuration, ILogger logger) - { - _configuration = configuration; - _logger = logger; - } - - public void Publish(TMessage message) - where TMessage : Message - { - using (var connection = CreateConnection()) - { - var data = MessageHelper.ToData(message); - connection.Publish(message.Subject, data); - } - } - - public IConnection CreateConnection() - { - var url = _configuration.GetValue("MessageQueue:Url"); - return new ConnectionFactory().CreateConnection(url); - } - } -} diff --git a/worker/dotnet/Worker/Messaging/Messages/Events/VoteCastEvent.cs b/worker/dotnet/Worker/Messaging/Messages/Events/VoteCastEvent.cs deleted file mode 100644 index a9f6755..0000000 --- a/worker/dotnet/Worker/Messaging/Messages/Events/VoteCastEvent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Worker.Messaging.Messages -{ - public class VoteCastEvent : Message - { - public override string Subject { get { return MessageSubject; } } - - public string VoterId {get; set;} - - public string Vote {get; set; } - - public static string MessageSubject = "events.vote.votecast"; - } -} \ No newline at end of file diff --git a/worker/dotnet/Worker/Messaging/Messages/Message.cs b/worker/dotnet/Worker/Messaging/Messages/Message.cs deleted file mode 100644 index 6265fee..0000000 --- a/worker/dotnet/Worker/Messaging/Messages/Message.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace Worker.Messaging.Messages -{ - public abstract class Message - { - public string CorrelationId { get; set; } - - public abstract string Subject { get; } - - public Message() - { - CorrelationId = Guid.NewGuid().ToString(); - } - } -} diff --git a/worker/dotnet/Worker/Program.cs b/worker/dotnet/Worker/Program.cs deleted file mode 100644 index 2f0e599..0000000 --- a/worker/dotnet/Worker/Program.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using System; -using Worker.Data; -using Worker.Entities; -using Worker.Messaging; -using Worker.Workers; - -namespace Worker -{ - class Program - { - static void Main(string[] args) - { - var config = new ConfigurationBuilder() - .AddJsonFile("appsettings.json") - .AddEnvironmentVariables() - .Build(); - - var loggerFactory = new LoggerFactory() - .AddConsole(); - - var services = new ServiceCollection() - .AddSingleton(loggerFactory) - .AddLogging() - .AddSingleton(config) - .AddTransient() - .AddTransient() - .AddSingleton() - .AddDbContext(builder => builder.UseMySQL(config.GetConnectionString("VoteData"))); - - var provider = services.BuildServiceProvider(); - var worker = provider.GetService(); - worker.Start(); - } - } -} diff --git a/worker/dotnet/Worker/Worker.csproj b/worker/dotnet/Worker/Worker.csproj deleted file mode 100644 index d85a98c..0000000 --- a/worker/dotnet/Worker/Worker.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - Exe - netcoreapp3.1 - - - - - - - - - PreserveNewest - PreserveNewest - - - - - - - - - - - - - - - diff --git a/worker/dotnet/Worker/Workers/QueueWorker.cs b/worker/dotnet/Worker/Workers/QueueWorker.cs deleted file mode 100644 index cd62c45..0000000 --- a/worker/dotnet/Worker/Workers/QueueWorker.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Threading; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; -using NATS.Client; -using Worker.Data; -using Worker.Messaging; -using Worker.Messaging.Messages; - -namespace Worker.Workers -{ - public class QueueWorker - { - private static ManualResetEvent _ResetEvent = new ManualResetEvent(false); - private const string QUEUE_GROUP = "save-handler"; - - private readonly IMessageQueue _messageQueue; - private readonly IConfiguration _config; - private readonly IVoteData _data; - protected readonly ILogger _logger; - - public QueueWorker(IMessageQueue messageQueue, IVoteData data, IConfiguration config, ILogger logger) - { - _messageQueue = messageQueue; - _data = data; - _config = config; - _logger = logger; - } - - public void Start() - { - _logger.LogInformation($"Connecting to message queue url: {_config.GetValue("MessageQueue:Url")}"); - using (var connection = _messageQueue.CreateConnection()) - { - var subscription = connection.SubscribeAsync(VoteCastEvent.MessageSubject, QUEUE_GROUP); - subscription.MessageHandler += SaveVote; - subscription.Start(); - _logger.LogInformation($"Listening on subject: {VoteCastEvent.MessageSubject}, queue: {QUEUE_GROUP}"); - - _ResetEvent.WaitOne(); - connection.Close(); - } - } - - private void SaveVote(object sender, MsgHandlerEventArgs e) - { - _logger.LogDebug($"Received message, subject: {e.Message.Subject}"); - var voteMessage = MessageHelper.FromData(e.Message.Data); - _logger.LogInformation($"Processing vote for '{voteMessage.Vote}' by '{voteMessage.VoterId}'"); - try - { - _data.Set(voteMessage.VoterId, voteMessage.Vote); - _logger.LogDebug($"Succesffuly processed vote by '{voteMessage.VoterId}'"); - } - catch (Exception ex) - { - _logger.LogError($"Vote processing FAILED for '{voteMessage.VoterId}', exception: {ex}"); - } - - } - } -} \ No newline at end of file diff --git a/worker/dotnet/Worker/appsettings.json b/worker/dotnet/Worker/appsettings.json deleted file mode 100644 index ecdb339..0000000 --- a/worker/dotnet/Worker/appsettings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "MessageQueue": { - "Url": "nats://message-queue:4222" - }, - "ConnectionStrings": { - "VoteData": "Server=mysql;Port=4000;Database=votes;User=root;SslMode=None" - }, - "Logging": { - "LogLevel": { - "Default": "Information" - } - }, - "AllowedHosts": "*" -} diff --git a/worker/pom.xml b/worker/pom.xml deleted file mode 100644 index 1fea098..0000000 --- a/worker/pom.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - 4.0.0 - - worker - worker - 1.0-SNAPSHOT - - - - - org.json - json - 20140107 - - - - redis.clients - jedis - 2.7.2 - jar - compile - - - - org.postgresql - postgresql - 9.4-1200-jdbc41 - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - worker - - - true - worker.Worker - dependency-jars/ - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.7 - 1.7 - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - attached - - package - - worker - - jar-with-dependencies - - - - worker.Worker - - - - - - - - - diff --git a/worker/src/Worker/Worker.csproj b/worker/src/Worker/Worker.csproj deleted file mode 100644 index 88e9a90..0000000 --- a/worker/src/Worker/Worker.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - netcoreapp3.1 - - - - - - - - - \ No newline at end of file diff --git a/worker/src/main/java/worker/Worker.java b/worker/src/main/java/worker/Worker.java deleted file mode 100644 index 8121430..0000000 --- a/worker/src/main/java/worker/Worker.java +++ /dev/null @@ -1,102 +0,0 @@ -package worker; - -import redis.clients.jedis.Jedis; -import redis.clients.jedis.exceptions.JedisConnectionException; -import java.sql.*; -import org.json.JSONObject; - -class Worker { - public static void main(String[] args) { - try { - Jedis redis = connectToRedis("redis"); - Connection dbConn = connectToDB("db"); - - System.err.println("Watching vote queue"); - - while (true) { - String voteJSON = redis.blpop(0, "votes").get(1); - JSONObject voteData = new JSONObject(voteJSON); - String voterID = voteData.getString("voter_id"); - String vote = voteData.getString("vote"); - - System.err.printf("Processing vote for '%s' by '%s'\n", vote, voterID); - updateVote(dbConn, voterID, vote); - } - } catch (SQLException e) { - e.printStackTrace(); - System.exit(1); - } - } - - static void updateVote(Connection dbConn, String voterID, String vote) throws SQLException { - PreparedStatement insert = dbConn.prepareStatement( - "INSERT INTO votes (id, vote) VALUES (?, ?)"); - insert.setString(1, voterID); - insert.setString(2, vote); - - try { - insert.executeUpdate(); - } catch (SQLException e) { - PreparedStatement update = dbConn.prepareStatement( - "UPDATE votes SET vote = ? WHERE id = ?"); - update.setString(1, vote); - update.setString(2, voterID); - update.executeUpdate(); - } - } - - static Jedis connectToRedis(String host) { - Jedis conn = new Jedis(host); - - while (true) { - try { - conn.keys("*"); - break; - } catch (JedisConnectionException e) { - System.err.println("Waiting for redis"); - sleep(1000); - } - } - - System.err.println("Connected to redis"); - return conn; - } - - static Connection connectToDB(String host) throws SQLException { - Connection conn = null; - - try { - - Class.forName("org.postgresql.Driver"); - String url = "jdbc:postgresql://" + host + "/postgres"; - - while (conn == null) { - try { - conn = DriverManager.getConnection(url, "postgres", "postgres"); - } catch (SQLException e) { - System.err.println("Waiting for db"); - sleep(1000); - } - } - - PreparedStatement st = conn.prepareStatement( - "CREATE TABLE IF NOT EXISTS votes (id VARCHAR(255) NOT NULL UNIQUE, vote VARCHAR(255) NOT NULL)"); - st.executeUpdate(); - - } catch (ClassNotFoundException e) { - e.printStackTrace(); - System.exit(1); - } - - System.err.println("Connected to db"); - return conn; - } - - static void sleep(long duration) { - try { - Thread.sleep(duration); - } catch (InterruptedException e) { - System.exit(1); - } - } -} diff --git a/worker/target/classes/worker/Worker.class b/worker/target/classes/worker/Worker.class deleted file mode 100644 index 0191c38..0000000 Binary files a/worker/target/classes/worker/Worker.class and /dev/null differ