вторник, 25 декабря 2012 г.

Почему блог "замерз"?

    Добрый день.
    Этот блог временно приостановлен, так как я все силы бросил на свой новый проект - курсы по Java Core + Junior Java Developer. Курсы проходят как в реале в Харькове, так и в виде вэбинаров для удаленных пользователей.
    Сайт курсов - KharkovITCourses.
    Видео лекций на youtube.

    В данный момент это И интересный бизнес И интересное занятие. Возможно, в перспективе будут курсы:
    - Middle Java Developer (Hibernate, Spring, JSF, jQuery)
    - Scala для программистов на Java
    - Multithreading programming in Java
    - Distributed programming in Java
    - ...

вторник, 3 июля 2012 г.

Twitter: Ruby + MySQL -> Java (Netty, Lucene, Zookeeper, Guice)

Twitter Search is Now 3x Faster

"In the spring of 2010, the search team at Twitter started to rewrite our search engine in order to serve our ever-growing traffic, improve the end-user latency and availability of our service, and enable rapid development of new search features. As part of the effort, we launched a new real-time search engine, changing our back-end from MySQL to a real-time version of Lucene. Last week, we launched a replacement for our Ruby-on-Rails front-end: a Java server we call Blender. We are pleased to announce that this change has produced a 3x drop in search latencies and will enable us to rapidly iterate on search features in the coming months."

"Blender is a Thrift and HTTP service built on Netty ..."

"We chose Netty over some of its other competitors, like Mina and Jetty, because it has a cleaner API, better documentation and, more importantly, because several other projects at Twitter are using this framework."

"We are using the twitter commons library (recently open-sourced!) to provide connection-pool management, load-balancing, and dead host detection."

пятница, 29 июня 2012 г.

Memory Ordering in Modern Microprocessors

Memory Ordering in Modern Microprocessors (Part IPart II).

"Linux provides a carefully chosen set of memory-barrier primitives, as follows:
  • smp_mb(): “memory barrier” that orders both loads and stores. This means loads and stores preceding the memory barrier are committed to memory before any loads and stores following the memory barrier.
  • smp_rmb(): “read memory barrier” that orders only loads.
  • smp_wmb(): “write memory barrier” that orders only stores.
  • smp_read_barrier_depends(): forces subsequent operations that depend on prior operations to be ordered. This primitive is a no-op on all platforms except Alpha."


    "All of Linux's locking primitives, including spinlocks, reader-writer locks, semaphores and read-copy updates (RCUs), include any needed barrier primitives."

    P.S. Тут, видимо, вариант той же самой статьи.
    P.P.S. Эти статьи можно использовать как введение к более сложному чтиву - "What Every Programmer Should Know About Memory" (114 pages).

Use cases for weakCAS

В java.util.concurrent.atomic.AtomicXXX есть волшебный метод weakCompareAndSet, который отличается от оригинального  compareAndSet двумя моментами:
---
Для такого поведения (второй пункт) найдено пока два Use Case:
A) счетчики
B) Michael-Scott queues (надо попробовать реализовать)

P.S. Как понимаю, j.u.c.ConcurrentLinkedQueue реализовано на основе Michael-Scott queue, но использует "strong" CAS.

понедельник, 25 июня 2012 г.

Efficient data transfer through zero copy

Efficient data transfer through zero copy.

Суть: при копировании File -> Socket через transferTo удается избежать лишних копирований данных и переключений user mode <-> kernel mode. Остается два копирования, но они делаются не через CPU, а через DMA.

Вопрос: возможно ли достичь аналогичного эффекта при копировании Socket -> Socket? Пока ищу ответ. Скажем, если я использую ByteBuffer.allocateDirect(...).

пятница, 8 июня 2012 г.

Докладываю доклад

Добрый день,
в следующую Сб расскажу "Java: пишем SOCKS4/5 proxy server на 10.000 соединений."

Было бы интересно Ваше мнение: уклон в какую сторону доклада такого типа Вас бы наиболее привлек?
- отдать весь код сервера/реализации протокола;
- сравнение с другими языками/подходами: Erlang, Node.js, etc;
- предоставлен анализ источников (книги/статьи по теме/полезные блоги);
- ...

четверг, 7 июня 2012 г.

Серверная и Контейнерная части EJB серверов: OpenEJB

Вероотступник Geronimo: OpenEJB и реализация EJB в Apache Geronimo.
    "OpenEJB, фактически, состоит из двух частей: сервера и контейнера, и команда прилагает все усилия, чтобы не смешивать их. В спецификации EJB говорится о контейнере и сервере как о раздельных частях, но нигде не даётся определение этих частей. OpenEJB устанавливает соглашение "контейнер-сервер", и, в конце концов, серверная часть OpenEJB была включена в Geronimo без каких-либо серьёзных изменений, а контейнер был полностью переписан для проекта. "Мы не используем Jetty целиком и не полностью используем OpenEJB, который существовал до создания Geronimo," заметил Дэвид. "Одна из вещей, которой [члены сообщества Geronimo] могут гордиться, состоит в том, что мы не склеивали части в произвольном порядке и не представили всем эдакого Франкенштейна".
    Серверная сторона OpenEJB содержит распределённую часть уравнения. В любой распределённой системе должны присутствовать две вещи: способность находить компонент или сервис, которые вы хотите использовать, а также способ их вызова после того, как они найдены. Отыскание компонента или сервиса обычно происходит с использованием какого-либо реестра. В веб-сервисах это -- Universal Description, Discovery and Integration (UDDI). В CORBA это -- CosNaming. В EJB это -- Java Naming и Directory Interface (JNDI). В идеале, вы должны иметь возможность позаботиться о второй части -- о вызове компонентов (будь это веб-сервис, CORBA-процедура, или удалённый EJB) при помощи обычных программных средств. Другими словами, вы должны иметь возможность вызывать компонент, как если бы он был локальным объектом.
    Серверная часть среды управляет этим процессом вызова, проверяя, что вызов достигает удалённого объекта, и что ответ возвращается к клиенту. Сервер также управляет такими задачами, как "передача состояния безопасности транзакции между вызовами," сказал Дэвид."
---
Как-то я не думал так о Java EE серверах.

вторник, 5 июня 2012 г.

JMS 2.0: Support for Multi-tenancy

Java EE 7 будет серьезно сфокусирована на clouds/PaaS и, как следствие, на обеспечении multitenancy [Arun Gupta about Java EE 7].

Нашел документ, описывающий как multitenancy, возможно, будет введена в JMS 2.0 (JMS 2.0 - часть Java EE 7) - JMS 2.0: Support for Multi-tenancy.

понедельник, 4 июня 2012 г.

A Note on Distributed Computing

A Note on Distributed Computing

Суть
Каждые 10 лет приходит новая волна моды на распределенные вычисления. 70-е - передача сообщений, 80-е - RPC, 90-е - распределенныные объекты (статья 94го года). Но основная проблема не в модели связывания computation + communication, а в принципиальных сложностях: latency, different model of memory access, concurrency, partial failure, lack of a central resource manager. Похоже, авторы - разработчики NFS.

Abstract

    We argue that objects that interact in a distributed system need to be dealt with in ways that are intrinsically different from objects that interact in a single address space. These differences are required because distributed systems require that the programmer be aware of latency, have a different model of memory access, and take into account issues of concurrency and partial failure.
    We look at a number of distributed systems that have attempted to paper over the distinction between local and remote objects, and show that such systems fail to support basic requirements of robustness and reliability. These failures have been masked in the past by the small size of the distributed systems that have been built. In the enterprise-wide distributed systems foreseen in the near future, however, such a masking will be impossible.
    We conclude by discussing what is required of both systems-level and application-level programmers and designers if one is to take distribution seriously.

среда, 30 мая 2012 г.

[JBoss]: Вызов бина, задеплоеного на удаленном сервере (3 способа)

EJB invocations from a remote client using JNDI
... return (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
... return (RemoteCounter) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful");

четверг, 24 мая 2012 г.

Использование Java на http://odnoklassniki.ru


Архитектура и платформа проекта Одноклассники:

Google Web Toolkit
Код написан на Java. Есть исключения – некоторые модули для кеширования данных написаны на C и C++. Java потому, что это удобный для разработки язык, много наработок в различных сферах, библиотек, open source проектов на Java.
хранения данных в памяти средствами Java Unsafe (я. - т.е. выделение памяти за пределами heap? почему не ByteBuffer.allocateDirect(int capacity))
Используются два решения для хранения и сервирования данных – MS SQL и BerkeleyDB.
Само сохранение происходит с помощью библиотеки log4j.
Для мониторинга “здоровья” оборудования используем Zabbix
WEB сервера – Apache Tomcat
Сервера бизнес логики работают под JBoss 4
Apache Lucene для индексирования и поиска текстовой информации
При общении серверов между собой используем свое решение, основанное на JBoss Remoting
Общение с SQL базами данных происходит посредством JDBC драйверов

среда, 23 мая 2012 г.

Интересно Ваше мнение

Что нужно от платформы для облачного PaaS?
    Рассмотрим следующую задачу: необходимо выбрать некоторый "Java Enterprise Application Server" (классическое Нечто, предоставляющее поддержку transaction, security, threading - EJB контейнер, Spring, возможно что-то еще) для написания некого PaaS. Пусть это будет некая гипотетическая 1C-в-облаке (или платформа для хостинга интернет-магазинов). Т.е. нечто имеющее свой front-end, кастомизированную бизнесс-логику и базу. Мы ожидает что у нас будет 10.000 корпоративных клиентов. Клиент - это группа пользователей, которые имеют возможность "шарить" между собой данные, под каждого клиента кастомизируется бизнесс-логика. Имеется следующая специфика - у нас 10-100 "бриллиантовых" клиентов - тех которые приносят нам основные доходы, под каждого из них выделяется 10-100 серверов (допустим они генерируют такую нагрузку) + остальные клиенты ничего нам не приносят, пришли в ходе рекламной кампании, завели полноценный экземпляр приложения и нагрузка от них такова, что можем позволить располагать их по 100 на одном сервере. Спектр между генерируемой нагрузкой непрерывно заполнен клиентами, т.е. есть такие клиенты, что их располагаем по 3 на сервере, а есть такие что требуют 1-3 сервера.
    Вопрос такой: что нам минимально необходимо требовать еще от платформы?
    Я пока вижу два основных требования:
    - поддержка multitenancy, т.е. возможность в рамках одного инстанса сервера/контейнера обрабатывать нескольких клиентов. При чем сервер/контейнер должен гарантировать как минимум две вещи: 1. невозможность одному клиенту вмешаться в работу другого (как минимум независимые classloader-ы, как у WAR в рамках сервлет-контейнера), 2. возможность выделять ресурсы контейнера каждому клиенту отдельно (конекшены к базе, пулы потоков, память под кэши). Ну или сверх-легковесный контейнер, такой что возможно запустить 100 инстансов контейнера на одной машине. Это для тех клиентов, которых сотня на машине.
    - прозрачная репликация бизнесс-модулей. Имею в виду следующее: любая функциональность, реализованная в виде "модуля" контейнера, получает логическое имя и в случае "выгорания" машины на которой выполнялся вызов функциональности, под это логическое имя автоматически поставляется другой экземпляр модуля на другой машине. Ну и, естественно, автоматическая балансировка нагрузки на модуль путем репликации. Это для высоконагруженных клиентов.

    Вопрос к знатокам - это все? Есть что почитать? Как с этим согласуется EJB/SOA/MOM/... ?

    P.S. Контекст таков - имеем EJB/Spring/WS-*/JMS спецов, хотим/будем писать/переводить продукт на PaaS.

вторник, 22 мая 2012 г.

[Блог]: Сценарии интеграции приложений

Сценарии интеграции приложений
...
Максим,
Шаблонов интеграции несколько больше четырех. То что вы упомянули: файл, бд, сообщения и удаленный вызов это домен шаблонов интеграции по типу обмена данными. Есть еще домены по методу интеграции (data-centric, function-centric, object-centric etc) и домен структурных шаблонов (точка-точка, звезда, смешанный).
Безусловно упомянутая вами группа шаблонов наиболее понятна, но и про другие забывать не стоит :)
У MS есть в открытом доступе неплохая книжка, правда с явным “закосом” под их же продукты и технологические стэк.
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=12474
Не то, чтобы я сильно любил MS, но у других вендоров с такой просветительской деятельностью вообще никак. Разве что у IBM: Patterns: Implementing an SOA Using an
Enterprise Service Bus
http://www.redbooks.ibm.com/redbooks/pdfs/sg246346.pdf

[Java EE]: хороший блог российского Архитектора

Архитектура Информационных систем
Максим Смирнов

Как я понял, Максим Смирнов - руководитель департамента ИТ-Архитектуры ЩФЩ "Вымпелком"

Articles on EIP

[wiki]: π-calculus

WIKI: π-calculus
    In theoretical computer science, the π-calculus (or pi-calculus) is a process calculus originally developed by Robin Milner, Joachim Parrow and David Walker as a continuation of work on the process calculus CCS (Calculus of Communicating Systems). The π-calculus allows channel names to be communicated along the channels themselves, and in this way it is able to describe concurrent computations whose network configuration may change during the computation.
    The π-calculus is elegantly simple yet very expressive. Functional programs can be encoded into the π-calculus, and the encoding emphasises the dialogue nature of computation, drawing connections with game semantics. Extensions of the π-calculus, such as the spi calculus and applied π, have been successful in reasoning about cryptographic protocols. Beside the original use in describing concurrent systems, the π-calculus has also been used to reason about business processes and molecular biology.

Articles About Java Technology

The Java Language Specification, Java SE 7 Edition

Patterns in Enterprise Software (Martin Fawler point of view)

Patterns in Enterprise Software
A personal survey of various efforts to catalog patterns for enterprise software development.

1. Patterns of Enterprise Application Architecture
2. Core J2EE Patterns
3. Enterprise Integration Patterns
4. Microsoft Enterprise Solution Patterns
5. Microsoft Data Patterns
6. Microsoft Integration Patterns
7. Domain Driven Design
8. Anasis Patterns
9. Data Model Patterns
10. Gang of Four
11. POSA

P.S. 11 книг только по паттернам, только в области корпоративной разработки и только по мнению Фаулера ... 

четверг, 3 мая 2012 г.

[Book]: Интересные книги

[Java EE]: Good Java EE Examples

Good JavaEE Examples

CDI:
    cdi-basic
    cdi-request-scope
    cdi-application-scope    
    cdi-interceptors
    cdi-produces-disposes
    decorators
    cdi-alternative-and-stereotypes
Web Services
    simple-webservice *
    webservice-handlerchain *
    webservice-holder *
    webservice-attachments
    webservice-inheritance
    webservice-security
    webservice-ws-security
...

[Java EE]: Adam Bien's Weblog

Adam Bien's Weblog
Блог Адама прекрасный способ ознакомится со всеми "tips&trics" современного Java EE(EJB, JMS, JNDI, JPA, JTA, JDBC, JSF, ServletAPI, ...).

P.S. Я на него вышел как на автора
1) Real World Java EE Patterns Rethinking Best Practices
2) Real World Java EE Night Hacks--Dissecting the Business Tier
Великолепные книги, маленькие (270+170страниц), но посвящающие в достаточно глубокие делали. Скажем, для меня было новостью, что CDI можно использовать для рассылки событий, java.net.URLConnection имеет проблемы с кэшированием и еще кучу мелочей.

Mnesia A Distributed Robust DBMS for Telecommunications Applications

[java.net]: Orderly Versus Abortive Connection Release in Java

Orderly Versus Abortive Connection Release in Java  

Overview
To ensure orderly or graceful release of TCP connections is a challenge with TCP networking applications. Abortive or ungraceful release may result if special care is not taken. In Java, an unexpected abortive release can manifest itself by the application receiving a java.net.SocketException when reading or writing to the socket. read() and write() normally return a numeric value indicating, respectively, the number of bytes received or sent. If an exception is received instead, this indicates the connection has been aborted and also that data may have been lost or discarded. This article explains what causes socket connections to be aborted and provides tips for avoiding the situation, except for the case where an application intends to abort the connection.

пятница, 27 апреля 2012 г.

[Java EE]: Comparing SCA, Java EE and JBI

Comparing SCA, Java EE and JBI:

"There are three approaches to develop back-end integration solutions:

- invocation (JCA, JAX-WS, WS-IF),

- mediation (JBI)

- activation (SCA)."

"This is precisely one of the problems in JEE today because back-end integration does not always fit well the synchronous request/response model."

P.S. Задача: таки разобраться что это такое - SCA, JBI, ESB:)

P.P.S. Суровый старается прояснить - "Три подхода к интеграции информационных систем":

Интеграция на уровне данных.

Интеграция на уровне бизнес-процессов (ESB).

Интеграция на уровне композитных приложений (JBI, SCA).

"...Таким образом на одном шаге бизнес-процесса могут взаимодействовать несколько сервисов, в то время как при интеграции на уровне бизнес-процессов на одном шаге процесса вызывается один сервис."

пятница, 20 апреля 2012 г.

Сменил работу - сменится тематика публикаций

Добрый день, я в Новый Год сменил работу.
Теперь занимаюсь не управлением учебным процессом в харьковском EPAM (+ преподавание), а Java EE Architect в Enko Solutions.
Вследствие чего может измениться тематика публикаций.
Вначале каждого поста могут появиться теги
- [PJP]: Professional Java Programming
- [J2EE]: J2EE
- [Quiz]: Quiz
- и т.д.
Это связано с тем, что материалы по Java EE стали входить в круг моих интересов.

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

среда, 28 марта 2012 г.

Lambda Expressions for the Java8

JSR-335 Lambda Expressions for the JavaTM Programming Language 0.4.2 Early Draft Review

JSR 335 (Lambda Expressions for the JavaTM Programming Language) aims to support programming in a multicore environment by adding closures and related features to the Java language.
JSR 335 is part of JSR 337 (Java SE 8). The Early Draft Review #1 of JSR 335 has been published.


Слайды от Brian Goetz.

Для добавления нового функционала в библиотеки, возможно, введут virtual extension method.

Gack, is this multiple inheritance in Java?
- Yes, but Java already has multiple inheritance of types
- This adds multiple inheritance of behavior too
- But not state, which is where most of the trouble is

Выступаю на РИТ 2012

Выступаю на РИТ 2012: http://ritconf.ru/2012/guru/index.html

Распределенные кэши: подводные камни
Иван Головач

Приводится последовательность реализаций распределенного кэша, которые один за одним исключают «негативные феномены» — совокупности чтения/записи, приводящие к нежелательным (и зачастую неожиданным) результатам. После чего такая последовательность ставится в соответствие с известными Memory Consistency Models (Linearizable, Sequential Consistent, Causal Order, PRAM, ...). Это позволяет теоретически обосновать и измерить «цену» за консистентность кэша.

Цель доклада — подвести разработанную теоретическую базу («Distributed Algorithms» by Nancy A. Lynch, «Distributed Computing: Fundamentals, Simulations, and Advanced Topics» by Hagit Attiya and Jennifer Welch, «Introduction to Distributed Algorithms» by Gerard Tel) в части Distributed Shared Memory over Message Passing под практически используемые кэши — показать, чем приходится платить (read latency, write latency, network packets count) за повышение уровня консистенции распределенного кэша.

Целевая аудитория
Доклад будет интересен всем специалистам, помещающим часть бизнесс-логики в distributed cache/IMDG (Oracle Coherence, Gemstone GemFire, Gigaspaces XAP, JBoss Infinispan, Hazelcast, EHCache).

Информация о докладчике
Иван Головач — J2EE архитектор в стартапе Domosti.ru, опыт 8 лет в j2ee, c++. В данный момент ответственный за архитектуру проекта Domosti.ru (EJB, JMS, Spring, Postgres, JSF, RichFaces).

Ведет блог KharkovConcurrencyGroup.blogspot.com.

Область математических интересов: подходы к спецификации non Strict Consistency систем (New Java Memory Model, Transaction Isolation Levels, Distributed Shared Memory Consistency Models)

четверг, 16 февраля 2012 г.

понедельник, 13 февраля 2012 г.

воскресенье, 5 февраля 2012 г.

четверг, 2 февраля 2012 г.

"Сладкие" вакансии

DISTRIBUTED MIDDLEWARE ARCHITECT
...
Saint Petersburg, Russia
...
15+ years of overall experience
5+ years in leading technical positions
100% hands-on individual developer
Proven early stage startup experience
Ability to work directly with CTO on critical areas of product functionality
Expert knowledge of Java, Scala and Groovy
Fluent in Unix/Win environment and system programming
Guru-level proven experience in high performance computing
Published work, speaking engagements are the major plus
Expert knowledge in parallel and distributed programming
Demonstrable experience in distributed middleware is a must
Keen understanding of target market and fundamental of product marketing
Ability to cross-function between sales, marketing and product development
Some travel may be required - up to 10%

воскресенье, 29 января 2012 г.

Java 7 Phaser - academia paper

Phasers: a Unified Deadlock-Free Construct for Collective and Point-to-point Synchronization

ABSTRACT
Coordination and synchronization of parallel tasks is a major source of complexity in parallel programming. These constructs take many forms in practice including mutual exclusion in accesses to shared resources, termination detection of child tasks, collective barrier synchronization, and point-to-point synchronization. In this paper, we introduce phasers, a new coordination construct that unifies collective and point-to-point synchronizations. We establish two safety properties for phasers: deadlock-freedom and phaseordering. Performance results obtained from a portable implementation of phasers on three different SMP platforms demonstrate that phasers can deliver superior performance to existing barrier implementations, in addition to the productivity benefits that result from their generality and safety properties.

P.S. From this article - New Java Concurrency Feature: Phasers