понедельник, 5 декабря 2011 г.

Две интересные вещи про volatile

Большинство Java разработчиков мало мальски знакомых с многопоточностью, знают:

Что операции с переменной помеченной как volatile синхронизируют кеши потоков! 

Однако мало кто знает следующие две вещи:


  1. Суть кеша потока зависит от архитектуры системы, для большинства из нас это x86, а это значит что кеш потока это регистры и кеши процессора.  
  2. Поскольку x86 это симметричная мультипроцессорная система, то volatile особо и не нужен в виде синхронизации кешей потоков, ведь для таких систем сама аппаратура обеспечивают когерентность кешей.

Так что читай господа и думайте, а то на собеседованиях ходить тошно!

воскресенье, 4 декабря 2011 г.

Example of unsafe secondary publication in Java

class SafePublsiher {
  private static volatile SafePublsiher p = null;
  public static SafePublsiher get() {
    // initialization block
    return p;
  }
}

class UnSafePublisher {
  private static SafePublisher p = null;
  public static SafePusblisher get() {
    if (p == null) { p = SafePublisher.get() }
    return p;
  }
}

воскресенье, 23 октября 2011 г.

Overview low-latency technology in Java



Problem

CMS or Paraller GC in Sun JVM on application with heap 2-4 Gb could stop it on time about 1 minute for collect dead objects! If your application is server application. If it should guarantee processing time at most 10 seconds with these GCs you can't do this. For example, if you work in bank sphere and you should process trades very very quickly in 1 second, you can't make this, because in each time GC could stop your threads and start collect =(

General information

All GC in JVM are generation GC http://en.wikipedia.org/wiki/Garbage_collection_(computer_science). Commonly they have three generation: 
  1. young - new objects
  2. old - objects are after a couple GC cycles
  3. permanent - classes and JVM data

GC has three variants of collect:
  1. minor - only young generation
  2. major - only old and permanent generation
  3. full - minor and major collection

Collect of young generation it's very fast process so in a majority cases when we talk about low-latency we mean decrease pause on collect old generation.

Solutions

Let's start from free decisions...


GC called G1 for Oracle JVM







This is free decision, which you could use on any Oracle (Sun) JVM starts from version 1.6-16, so it's very cheap decision. Just turn on this GC JVM option: -XX:+UseG1G

It devides heap on same regions by default 1 Mb. Simultaneously with application GC watchs for live objects in each region. This statistics allow its make pauses very small and predictable.

You could specify for G1 pause max interval over JVM parameter:  -XX:GCPauseIntervalMillis=50. G1 no gurantees that pauses always be less then max interval but G1 tend to make this.


LMAX 

It's not really decision for decrease GC pause and it expensive because it's not ready decision, it's just architecture. So if you wish use it you should refactor your application. 


General points: that business logic executes sequentially (one trade) on in-memory objects without expensive IO operations. The works like marshaling, unmarshalling execute in separated threads input and output discruptor. This arhitecture helps GC because it devides all heap objects on very temporary and very permanent very good. And as we know young collect is very fast.


Azule JVM

Not free from fee decision. Azule provide GC which collect old and young gen without stop the world pauses. For implement this Azule use own JVM. This JVM use memory paging subsystem for control object life-cycle. It's risky decision when you have working application because you should migrate on new JVM.


JRTS

Java Real-time system it's not free decision. JRTS it's just standard so you could find many implementations: reference from Sun, Oracle and etc. In any cases you should migrate on new JVM, but I don't think that it's big problem in this case all of this JVM very stability and well tested. For decrease GC  pauses JRTS define three types of real time threads. Non-heap, critical and non-critical. The first threads executed without  any GC pauses, it's reach over define special memory part for this threads. 


Metronome GC from IBM



Not free from fee decision which allow only on IBM JVMs. Metronome allow you specify max GC pause and reach it over using three features: very chip read-barriers, technique of divide large arrays on parts and quantums. Last feature divide GC work on very small pieces about 500us. GC alternate its work with application work, so for example from each 10 millisecond GC use only 30% time.


BigMemory from Terracota



Not free decision. Use Java NIO http://en.wikipedia.org/wiki/New_I/O for hide big amount of data from GC. 




пятница, 23 сентября 2011 г.

Implement DSL in Groovy 1.8

General approach

a b c d 
equivalent to
a(b).c(d)

Real live example

Real DSL

Scenarios in old Groovy style:
def t1 = inject(new1).A_SYSTEM(trade).to(OUR_SYSTEM).with(source_id: "X")
receive(request).to(B_SYSTEM).with(ID: t1.name)
Scenarios in Groovy 1.8 style:
def t2 = inject new1 A_SYSTEM trade to OUR_SYSTEM with SOURCE_ID: "X", OTHER_ID: "XY"
receive request to B_SYSTEM with ID: t2.name

Implementation

def new1 = {}
def trade = {}
def ourSystem = {}
def request = {}
def B_SYSTEM = {}

def inject(kind) {
    [
            A_SYSTEM: {what ->
                [
                        to: {place ->
                            [
                                    with: { it ->
                                        println it
                                        return new Object() {def name = 1}
                                    }
                            ]
                        }
                ]
            }
    ]
}

def receive(what) {
    [
            to: {place ->
                [
                        with: {parameters ->
                            println parameters
                            return new Object() {def name = 2}
                        }
                ]
            }
    ]
}

Conclusion

  • No dots in method calls and parenthesis
  • Good debug because this decision use standart groovy withoud GroovyConsole
  • More flexibility in DSL syntacsis

Links

четверг, 15 сентября 2011 г.

О командах

Прочел замечательнейшую книгу: Бельбин - Команды менеджеров


Эссенция книги


Важные моменты


  • Идеальный размер команды 6 человек, это эксперементальный показатель.
  • В любой команде должен быть хоть один член с высоким показателем ОКМ (оценка критического мышления)



Типы команд

Существуют следующие (я упоминаю наиболее успешные) типы команд:
  1. Команда ЭУЭ (эмоционально уровновешенные экстраверты)
  2. Команды Аполлон
  3. Смешанные команды


Команды ЭУЭ

Работают дружно. Получают удовольствие от работы в группе. Применяют универсальные подходы. Хорошо используют ресурсы. Но склонны к эйфории и ленивы. Результаты: в целом хорошие, но индивидуально все зависят друг от друга и от всей группы. Лучше все действуют в напреженной обстановке, идиля их расслабляет.

Главное преимущество команд такого типа: активный обмен информацией середи участников команды и во вне.

Наблюдается у этих команд два похода к работе:
  1. Активная совместная работа - съедает много времени, но всесторонние обсуждение вопросов всеми членами, помогает избегать ошибок
  2. Большая персональная отвественность - в такой стратегии стремяться работать парами и опять таки избегают односторонних решений, что благоприятно сказываеться на их качестве


Команды Аполлон

Это команды людей с высоким показателем ОКМ (Оценка критического мышления) или проще говоря интелект.

Такие команды бывают успешные только в очень опредленных случаях, а именно когда в них существует только один сверхдоминирующий член, а именно капитан, при этом не столь стремящийся поразить всех интелектом как более напоминающий смазку между остальными участниками.

Наибольшая же проблема таких команд: трудноуправляемость, склонность к бесплодным дебатам, затрудненние в принятии решений. Каждый игрок «суперкоманды» действовал по личному сценарию, без согласования своих действий с коллегами.


Смешанные команды

Самые стабильные с точки зрения результата команды способные работать в самых разнообразных условия.

В смешанных командах участники разные, но каждый из них членов выполняет одну или две роли, возможно даже больше, вот они:
  1. Аналитик
  2. Вдохновитель
  3. Рабочая пчелка
  4. Контролер
  5. Генератор идей
  6. Руководитель
  7. Мотиватор
  8. Снабженец

Эти роли можно представить в виде пар: СН - ВД, РП - КН, АН - ГИ, РК - МТ. Успех смешанных команд лежит в том что члены команды берут на себя роль которая им наиболее походит, а возможно и две сразу и отказывают себе в выполненние других ролей. 

Для определения своей роли вы можете воспользоваться тестом преведенном в книги или его аналогом в интернете.

Остановимся на каждой из них попорядку. 


Аналитик

Командная роль, исполнитель которой анализирует проблемы. Он оценивает идеи и предложения, чтобы команда могла принимать сбалансированные решения.

Вдохновитель

Командная роль, исполнитель которой способствует проявлению достоинств всех членов команды. Он поддерживает при неудачах. Он улучшает взаимоотношения между коллегами и стимулирует подъем командного настроя.

Рабочая пчелка

Командная роль, исполнитель которой концепции и планы превращает в рабочие процедуры, систематически и продуктивно исполняет принятые на себя обязательства.


Контролер

Командная роль, исполнитель которой, насколько это возможно, избавляет команду от ошибок, связанных как с деятельностью, так и с бездеятельностью. Контролер выявляет такие аспекты деятельности, которые требуют повышенного внимания. Он побуждаег команду проявлять настойчивость в достижении цели.


Генератор идей

Командная роль, исполнитель которой выдвигает новые идеи и стратегии, уделяя при этом особое внимание решению основных проблем, с которыми сталкивается группа.

Руководитель

Командная роль, исполнитель которой выбирает путь продвижения команды к общим целям, обеспечивая оптимальное использование ресурсов команды. Руководитель определяет сильные и слабые стороны команды и добивается эффективного применения личностного потенциала каждого члена команды.


Мотиватор

Командная роль, исполнитель которой придает действиям команды упорядоченную форму. Он направляет внимание членов команды на стоящие перед ними задачи и обозначает приоритеты. Мотиватор стремится к упорядоченности групповых обсуждений и к ясности результатов командной деятельности.

Снабженец

Командная роль, исполнитель которой обнаруживает и сообщает о новых идеях, разработках и ресурсах, имеющихся за пределами группы. Налаживаег полезные для команды внешние контакты и проводит переговоры.




понедельник, 18 июля 2011 г.

NServiceBus

Overview


Features


NServiceBus http://www.nservicebus.com/GettingStarted.aspx — is simple framework that provides you simple API for queues and implements the ESB http://en.wikipedia.org/wiki/Enterprise_service_bus model. With NServiceBus you could construct your application in SOA style http://en.wikipedia.org/wiki/Service-oriented_architecture.

NServiceBus supports SAGAS — The Saga is a pattern that addresses these challenges uncovered by the relational database community years ago, packaged in NServiceBus for ease of use by developers. http://www.nservicebus.com/Sagas.aspx

NServiceBus by default use for transport MSMQ http://en.wikipedia.org/wiki/Microsoft_Message_Queuing so it supports transactions, durability, distribute transactions, retry logic and encryption from the box.

From the box NServiceBus supports work on HTTP for communicate over internet

You can find good video guide about NServiceBus http://www.techdays.ru/videos/2295.html

Performance


It bases on MSMQ. So it performance wholly depends on MSMQ performance. On same envoriments the NServiceBus performance could be compared with WCF, BizTalk and Neuron ESB in some cases NServiceBus can be faster, for example: http://www.udidahan.com/2008/05/21/nservicebus-performance/

Monitoring


As a part of the NServiceBus installation, a new performance counter called "Critical Time" is added underneath the new "NServiceBus" category. All processes running with the NServiceBus Host collect this information but if you want them to expose it you need to include "NServiceBus.PerformanceCounters" as one of the arguments to the host process. You can find more information on how to do this here.

In additional you could use embedded in MSMQ counters.

Additional information you could find here http://www.nservicebus.com/Profiles.aspx

Install

  • Download zip with code and examples from http://www.nservicebus.com/Downloads.aspx
  • If you use Windows 7, Windows 7 users, make sure to unblock the zip file by right-clicking the downloaded zip, selecting properties, and pressing "Unblock".
  • Open example project from folder zip folder\your net version\examples\PubSub. After open please run (press F5 in Visual Studio) if you see 3 console windows NServiceBus works correctly.
  • This batch file that ensures that MSMQ is installed on your machine and is configured correctly. It also configures the DTC service and installs some performance counters.

How use


Define your message

Any messages in NServiceBus are POCO objects but they should support markered interface IMessage:
[Serializable]
public class EventMessage : IMessage {
    public Guid EventId { get; set; }
    public DateTime? Time { get; set; }
    public TimeSpan Duration { get; set; }
}

Configure publisher


<MsmqTransportConfig
    InputQueue="MyPublisherInputQueue"
    ErrorQueue="error"
    NumberOfWorkerThreads="1"
    MaxRetries="5"
  />

<UnicastBusConfig
    DistributorControlAddress=""
    DistributorDataAddress=""
    ForwardReceivedMessagesTo="">
    <MessageEndpointMappings>
    </MessageEndpointMappings>
</UnicastBusConfig>

Define publisher


public class ServerEndpoint : IWantToRunAtStartup {
    public IBus Bus { get; set; }

    public void Run() {
        while (Console.ReadLine() != null) {
            var eventMessage = publishIEvent ? Bus.CreateInstance() : new EventMessage();

            eventMessage.EventId = Guid.NewGuid();

            Bus.Publish(eventMessage);
        }
    }

    public void Stop() {

    }
}


Subscriber


Configuration


You could use two ways for configure your application: over xml and over code. Let's use second way:
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization {
    public void Init() {
        NServiceBus.Configure.With()
            .CastleWindsorBuilder() // just to show we can mix and match containers
            .XmlSerializer()
            .UnicastBus()
            .DoNotAutoSubscribe(); //managed by the class Subscriber2Endpoint
    }
}

Message handler


public class EventMessageHandler : IHandleMessages {

    public void Handle(IEvent message) {
        Logger.Info(string.Format("Subscriber 2 received IEvent with Id {0}.", message.EventId));
    }

    private static readonly ILog Logger = LogManager.GetLogger(typeof (EventMessageHandler));
}

Saga


State


Using NServiceBus, you can explicitly define the data used for this state by implementing the interface IContainSagaData - all public get/set properties will be persisted by default:

public class MySagaData : IContainSagaData {

    // the following properties are mandatory
    public virtual Guid Id { get; set; }
    public virtual string Originator { get; set; }
    public virtual string OriginalMessageId { get; set; }

    // all other properties you want persisted - remember to make them virtual
}

NServiceBus uses NHibernate to transparently store your saga data in a database. It can also automatically generate the database schema for storing these classes (through the use of Fluent NHibernate). You can, as always, swap out these technologies - just implement the IPersistSagas interface.

Adding behaviour


public class MySaga : Saga, IHandleMessages, IHandleMessages {

    public void Handle(Message1 message) {
        // code to handle Message1
    }

    public void Handle(Message2 message) {
        // code to handle Message2
    }

}

суббота, 2 июля 2011 г.

NB Scrum

Взамен скрам покер карт для Andoird. Страница проекта: http://code.google.com/p/netburstscrum/

среда, 25 мая 2011 г.

Ассемблерный код для Java классов

Sun JVM компилирует байт код в довольно красивый ассемблерный код, например:

Дано класс:

public class AssemblerTestRunner {

    private int counter = 0;

    public void execute() {
        counter += 1;
    }

}

Ассемблерный код метода:

SUB    ESP,8  # Create frame
013     INC    [ECX + #8] ! Field assemblertest/AssemblerTestRunner.counter
016     ADD    ESP,8 # Destroy frame

Как это проверить самому?

  • Для этого нужно достать отладочную версию JDK, например тут: http://download.java.net/jdk6/
  • Указать в параметрах запуска java: -server -XX:CompileThreshold=1 -XX:MaxInlineSize=0 -XX:FreqInlineSize=1000 -XX:+PrintCompilation -XX:+PrintOptoAssembly. Тут: -XX:+PrintOptoAssembly самый важный и он доступен только на отладночной версии
  • Написать тестовую программу и запустить, получите в логах или в каталоге выполненния файл hotspot.log

Описание опций можно найти тут: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

суббота, 2 апреля 2011 г.

Люди меняют проекты, в поисках: нового, необычного, интересно, классного!
Но может, они просто не замечают что уже работают в таком проекте?!
Или быть может, они не хотят сделать его таковым?!

вторник, 12 января 2010 г.