앞장에서 싱글톤 클러스터를 이용하여, 무수히 발생하는 이벤트를 액터 메시지로 모아서 데이터 인입에 성능 효율을 올려보았습니다.
데이터 인입 성능 효율을 위해 사용된 ORM 벌크 인서트를 자세하게 살펴보겠습니다.
벌크 인서트는 10만개의 데이터를 단 5초이내에 인입을 할것입니다.
테스트 코드
이제부터 테스트코드가 스스로 설명하기때문에 자세한 설명을 생략하겠습니다.
public class BulkInsertTest : TestKitXunit { private AppSettings appSettings; public BulkInsertTest(ITestOutputHelper output) : base(output) { Setup(); } public void Setup() { appSettings = new AppSettings() { DBConnection = "server=localhost;port=33061;database=showa_search;user=root;password=root;" }; } [Theory] [InlineData(50000, 100, 10)] //5만개의 데이터 인입에 소요시간은 10초이내여야한다. (배치사이즈:한번처리하는데 최대수:튜닝) public void BulkSppedTest(int daatSize,int batchSize, int cutoff) { var bulkItems_reseverd = new List<MessageReseved>(); for(int i = 0; i < daatSize; i++) { var addData = new MessageReseved() { Seq = i.ToString(), no = i, Message = "TestMessage" + i, updateTime = DateTime.Now }; bulkItems_reseverd.Add(addData); } Within(TimeSpan.FromSeconds(cutoff), () => { EntityFrameworkManager.ContextFactory = context => new BatchRepository(appSettings); using (var context = new BatchRepository(appSettings)) { context.BulkInsertAsync(bulkItems_reseverd, options => { options.BatchSize = batchSize; }).Wait(); } }); } }
성능테스트
5만개의 데이터를 인입하는데 5초가 소요되었습니다.
참고
- src : https://github.com/psmon/AkkaForNetCore/blob/master/AkkaNetCoreTest/Repositories/BulkInsertTest.cs
- bulk insert를 처리하기위한 Entity Expand Lib : https://entityframeworkcore.com/saving-data-bulk-insert