Mimari

Proje, Python 3.8’de herhangi bir web servis kütüphanesi kullanılmadan Celery üzerinde belirli aralıklarla çalışan tasklar üzerinden asenkron olarak çalışacak şekilde tasarlanmıştır.

Celery broker olarak Redis’i kullanıyor, veritabanı bulunmuyor ve bunun dışında minimal durum bilgisi barındırdığı için (stateless) yatay ölçeklenme konusunda esnek bir altyapı sunuyor. Şu ana kadar olan geliştirmelerde Redis üzerinde de broker’ın kendi kullanımı dışında cache amaçlı olarak herhangi bir veri tutulmadı. Durum bilgisi olarak sayılacabilecek ortam değişkenleri, ACC üzerinde uygulama kurulduğu zaman besleniyor ve bazı nadir durumlarda güncelleme alıyor. Bu senaryoda uygulama yeniden başlatılarak, uygulamanın güncellemeleri alması gerekiyor.

Mimari, genel olarak 3 temel bloktan oluşuyor: Omnitron Entegrasyonu, Satış Kanalı Entegrasyonu ve de tasklar.

Entegrasyon

Entegrasyon kısımları ortak bir ebeveyn sınıf üzerinden Komut (Command) tasarım örüntüsünü kullanarak tanımlandı. Gerekli olan akışlar için OmnitronIntegration ve ChannelIntegration sınıflarında varsayılan komutlar geliştirildi.

Komutlar task metotlarının tanımlandığı noktada birbiri ardına çağrılmaktadır. Birinin çıktısı, sonrakinin girdisi olduğu için uygun formatta çıktı üretip girdi almaktadırlar. Bu sebeple tanımlanan arayüzlere sadık kalınması şiddetle tavsiye edilmektedir.

class BaseIntegration[kaynak]

To integrate with any system you must create a class which inherits from BaseIntegration. This class was designed to work with command design pattern which basically defines a task procedure interface. All defined commands override some of the default base methods according to their requirements.

do_action(key: str, **kwargs) Any[kaynak]

Runs the command given with the key and supplies the additional parameters to the command.

Parametreler
  • key – Command key

  • kwargs – Any additional parameters can be specified, for example objects must be supplied if you want to provide input to the action.

Dönüşler

Result of the command

do_action_async_run(key: str, **kwargs) Any[kaynak]

Runs the command given with the key asynchronously and supplies the additional parameters to the command.

Parametreler
  • key – Command key

  • kwargs – Any additional parameters can be specified, for example objects must be supplied if you want to provide input to the action.

Dönüşler

Result of the command

property catalog: omnisdk.omnitron.models.Catalog

Retrieves the catalog object using the catalog_id stored in the self.

Side effect: It stores the result in the self.catalog_object, if catalog is updated on the currently running task you must delete self.catalog_object and re-call this method

property channel: omnisdk.omnitron.models.Channel

Retrieves the channel object using the channel_id stored in the self.

Side effect: It stores the result in the self.channel_object, if channel is updated on the currently running task you must delete self.channel_object and re-call this method

Omnitron Entegrasyonu

Omnitron entegrasyonu, Channel App Template’ın, Omnitron servislerini çağırıp, CRUD işlemlerini, farklı servislerden veri toplamayı ve verilerin uygun formata dönüşümünü yaptığı sınıftır.

Burada farklı amaçlar için tanımlanmış komutlar bulunmaktadır. Örneğin; ürün oluşturma, ürün silme ve stok güncelleme bunlardan birkaçı. Komutların tamamının listesi için referans dokümanını inceleyebilirsiniz.

OmnitronIntegration sınıfı altındaki tüm komutlar, standart bir arayüz sunması ve de temel olarak kullanıldığı her projede tekrar tekrar yazılmasının önüne geçmek adına, girdi ve çıktı olarak DTO(Data Transfer Object) sınıflarını kullanmaktadırlar. Böylece farklı pazaralanları için geliştirilen projelerde aynı veri formatına dönüştürüldüğü sürece komutlar çalışmaya devam edecektir.

İdeal bir senaryoda OmnitronIntegration sınıfını türetmeye gerek olmayacak ve sınıf doğrudan kullanılabilecektir. Omnitron ve Channel App Template arasındaki iletişimde de değişen noktalar olabileceği gibi, modeller ve yapı çoğunlukla sabit kalacağından, A ve B pazaralanları için farklı geliştirme yapılması ihtimali düşüktür.

class OmnitronIntegration(create_batch=True, content_type=None)[kaynak]

Communicates with the Omnitron Api services through the commands defined. It manages OmnitronApiClient object on enter and exit methods.

__init__(create_batch=True, content_type=None)[kaynak]

Some environment parameters are stored in the integration object for convenience.

Parametreler

create_batch – Flag to decide whether a batch request to be created

Satış Kanalı Entegrasyonu

Satış kanalı entegrasyonu, Channel App Template’ın, satış yapmak istediği pazaralanının servislerini çağırıp, CRUD işlemlerini, farklı servislerden veri toplamayı ve verilerin uygun formata dönüşümünü yaptığı sınıftır.

Satış kanalı servisleri ile bağlantı kurmak için istemci sınıfı yazılacaksa ya da requests kütüphanesi üzerinden herhangi bir sarmalayıcı bir yapı kullanmadan istekler atılacaksa, gerekli nesnelerin ve ayar değişkenlerinin bu sınıfın __init__ metodunda tanımlanması önerilir.

ChannelIntegration sınıfındaki komutlar __mocked_request adında mock veri ile çalışan varsayılan bir metot barındırıyor. Bunlar taslak olarak kullanılan metotların baştan sona çalışması için hazırlandı. Her pazaralanı için farklı bağlantı ve servisler bulunacağından dolayı ortak bir çözüm uygulanması teknik olarak mümkün değil. Channel App geliştiricileri buradaki komutları türetmeli ve send metodunu ezerek komutu tamamlamalı. Yeni send metodunda pazaralanı servislerine istek atıp verileri de Omnitron komutlarının beklediği DTO nesnelerine dönüştürmeli.

class ChannelIntegration[kaynak]

Communicates with the Channel Api services through the commands defined.

If an Api Client class is developed, initialization and deletion should be handled in ChannelIntegration class so that commands have easier access to the api object.

Komut Arayüzü

Komut arayüzü, yapılacak işlemler için standart metotlar belirleyen bir tasarım örüntüsüdür. Çalıştır, gönder, getir gibi varsayılan metotların farklı komutlarda ihtiyaca göre değişen kısımlarının ezilmesiyle minimal değişikliklerle farklı komutlar geliştirilir. Böylece hata yönetimi, genel akış, ekstra modüllerin statü yönetimleri gibi diğer gereksinimler her bir komut için tekrar tanımlanmaz.

class CommandInterface[kaynak]
get_data() object[kaynak]

This method fetches the input data for the command.

transform_data(data) object[kaynak]

This method can be used to format the input data before it is executed on the run method.

validated_data(data) dict[kaynak]

If the input data needs to satisfy some conditions or contain required a parameter, the validation is done here.

send(validated_data) object[kaynak]

If the command sends a request using input data to achieve the main object of the command, it is recommended to place those operations in this method.

Parametreler

validated_data

Tasklar

Tasklar, farklı komutların birbiri ardına çalıştırılmasıyla bir iş akışını tamamlayan düzenli aralıklarla çalışan metotları ifade eder. Uygulamanın giriş noktalarıdır. Komutlar kendi başlarına çağrılmaz. Bir task içerisinde sadece o komutun çalışacağı şekilde tanımlanabilir. Tasklar, Celery üzerindeki tanımlı programa göre düzenli olarak çalıştırılır ya da manuel olarak Flower üzerinden tetiklenebilir. Tasklar akışları oluşturan birimlerdir. Bu konu hakkında daha detaylı bilgi için Akışlar bölümünü inceleyebilirsiniz.

Servisler(Flowlar)

Servisler, tasklar aracılığıyla Akinon ile Satış Kanalı Entegrasyonu arasındaki iletişimi sağlayan kısımdır. Akinondan verinin okunması/yazılması ve Satış Kanalı ile iletişime geçilmesi olmak üzere 2 temel adımdan oluşur.

Module

Açıklama

Kurulum Servisi

Kurulum aşamasına ait komutlar

Ürün Servisi

Ürün ile ilgili komutlar

Fiyat Servisi

Fiyat ile ilgili komutlar

Stok Servisi

Stok ile ilgili komutlar

Resim Servisi

Resim ile ilgili komutlar

Sipariş Servisi

Sipariş ile ilgili komutlar